Saya mencoba untuk memvalidasi file XML terhadap skema yang direferensikannya. (Menggunakan Delphi dan MSXML2_TLB.) Kode (bagian yang relevan dari) terlihat seperti ini:
procedure TfrmMain.ValidateXMLFile;
var
xml: IXMLDOMDocument2;
err: IXMLDOMParseError;
schemas: IXMLDOMSchemaCollection;
begin
xml := ComsDOMDocument.Create;
if xml.load('Data/file.xml') then
begin
schemas := xml.namespaces;
if schemas.length > 0 then
begin
xml.schemas := schemas;
err := xml.validate;
end;
end;
end;
Hasilnya adalah bahwa cache dimuat ( schemas.length > 0), tetapi kemudian tugas berikutnya memunculkan pengecualian: "hanya XMLSchemaCache-schemacollections yang dapat digunakan."
Bagaimana saya harus melakukan ini?
Saya telah menemukan pendekatan yang tampaknya berhasil. Saya pertama kali memuat skema secara eksplisit, lalu menambahkannya ke schemacollection. Selanjutnya saya memuat file xml dan menetapkan schemacollection ke properti schemasnya. Solusinya sekarang terlihat seperti ini:
uses MSXML2_TLB
That is:
// Type Lib: C:\Windows\system32\msxml4.dll
// LIBID: {F5078F18-C551-11D3-89B9-0000F81FE221}
function TfrmMain.ValidXML(
const xmlFile: String;
out err: IXMLDOMParseError): Boolean;
var
xml, xsd: IXMLDOMDocument2;
cache: IXMLDOMSchemaCollection;
begin
xsd := CoDOMDocument40.Create;
xsd.Async := False;
xsd.load('http://the.uri.com/schemalocation/schema.xsd');
cache := CoXMLSchemaCache40.Create;
cache.add('http://the.uri.com/schemalocation', xsd);
xml := CoDOMDocument40.Create;
xml.async := False;
xml.schemas := cache;
Result := xml.load(xmlFile);
if not Result then
err := xml.parseError
else
err := nil;
end;
Penting untuk menggunakan XMLSchemaCache40 atau yang lebih baru. Versi sebelumnya tidak mengikuti standar W3C XML Schema, tetapi hanya memvalidasi terhadap Skema XDR, spesifikasi MicroSoft.
Kerugian dari solusi ini adalah saya perlu memuat skema secara eksplisit. Menurut saya, itu seharusnya bisa diambil secara otomatis.
Meskipun BennyBechDk mungkin berada di jalur yang benar, saya memiliki beberapa masalah dengan kodenya yang akan saya perbaiki di bawah ini:
uses Classes, XMLIntf, xmlDoc, SysUtils;
function IsValidXMLDoc(aXmlDoc: IXMLDocument): boolean;
var
validateDoc: IXMLDocument;
begin
result := false; // eliminate any sense of doubt, it starts false period.
validateDoc := TXMLDocument.Create(nil);
try
validateDoc.ParseOptions := [poResolveExternals, poValidateOnParse];
validateDoc.XML := aXmlDoc.XML;
validateDoc.Active := true;
Result := True;
except
// for this example, I am going to eat the exception, normally this
// exception should be handled and the message saved to display to
// the user.
end;
end;
Jika Anda ingin sistem hanya memunculkan pengecualian, maka tidak ada alasan untuk menjadikannya berfungsi sejak awal.
uses Classes, XMLIntf, XMLDoc, SysUtils;
procedure ValidateXMLDoc(aXmlDoc: IXMLDocument);
var
validateDoc: IXMLDocument;
begin
validateDoc := TXMLDocument.Create(nil);
validateDoc.ParseOptions := [poResolveExternals, poValidateOnParse];
validateDoc.XML := aXmlDoc.XML;
validateDoc.Active := true;
end;
Karena validateDoc adalah antarmuka, ini akan dibuang dengan benar saat fungsi / prosedur keluar, Anda tidak perlu melakukan pembuangan sendiri. Jika Anda memanggil ValidateXmlDoc dan tidak mendapatkan pengecualian, maka valid. Secara pribadi saya suka panggilan pertama, IsValidXMLDoc yang mengembalikan true jika valid atau false jika tidak (dan tidak menimbulkan pengecualian di luar dirinya sendiri).
Saya mengerjakan solusi Miel untuk memecahkan disadventage. Saya membuka xml dua kali, sekali untuk mendapatkan ruang nama, dan yang lainnya, setelah membuat kumpulan skema, untuk memvalidasi file. Ini bekerja untuk saya. Sepertinya IXMLDOMDocument2, setelah terbuka, jangan menerima set properti skema.
function TForm1.ValidXML2(const xmlFile: String;
out err: IXMLDOMParseError): Boolean;
var
xml, xml2, xsd: IXMLDOMDocument2;
schemas, cache: IXMLDOMSchemaCollection;
begin
xml := CoDOMDocument.Create;
if xml.load(xmlFile) then
begin
schemas := xml.namespaces;
if schemas.length > 0 then
begin
xsd := CoDOMDocument40.Create;
xsd.Async := False;
xsd.load(schemas.namespaceURI[0]);
cache := CoXMLSchemaCache40.Create;
cache.add(schemas.namespaceURI[1], xsd);
xml2 := CoDOMDocument40.Create;
xml2.async := False;
xml2.schemas := cache;
Result := xml2.load(xmlFile);
//err := xml.validate;
if not Result then
err := xml2.parseError
else
err := nil;
end;
end;
Saya sebelumnya telah memvalidasi dokumen XML menggunakan kode berikut:
Uses
Classes,
XMLIntf,
SysUtils;
Function ValidateXMLDoc(aXmlDoc: IXMLDocument): boolean;
var
validateDoc: IXMLDocument;
begin
validateDoc := TXMLDocument.Create(nil);
validateDoc.ParseOptions := [poResolveExternals, poValidateOnParse];
validateDoc.XML := aXmlDoc.XML;
validateDoc.Active := true;
Result := True;
end;
Jana Duggar terbuka tentang pencarian cintanya. Inilah semua yang dia katakan tentang topik dan jendela lima tahun untuk menikah.
Bintang 'Outlander' Sam Heughan baru-baru ini mengungkapkan apa yang akan dia ambil dari lokasi syuting untuk mengingat Jamie Fraser, peran yang membuatnya menjadi bintang.
'She Loves You' ditulis dalam satu jam, direkam dalam sehari, dan merupakan lagu The Beatles dengan salah satu penampilan terbaik dalam karir mereka.
Dolly Parton dan Nenek Bessie memiliki hubungan khusus. Nenek Parton sakit parah, tapi itu tidak menghentikan Dolly untuk mengerjainya.
Anda mungkin mengira kayu ek atau hickory kuat, tetapi jika berbicara tentang kayu terkeras di dunia, keduanya tidak ada yang mendekati.
Lautan memang penuh keindahan, tetapi juga menyembunyikan beberapa makhluk laut paling menakutkan di planet ini. Banyak dari hewan ini bersembunyi jauh di bawah permukaan laut, di dunia laut dalam yang gelap dan bertekanan tinggi.
Jika Anda sedang melawan monster musuh atau bersiap untuk skenario PvP, mengetahui pesona pedang terbaik di Minecraft dapat memberi Anda keuntungan besar. Memikat pedang memungkinkan Anda menghasilkan lebih banyak kerusakan, meningkatkan jumlah monster yang dijatuhkan, dan memperpanjang daya tahan pedang Anda.
Ketika orang berbicara tentang negara sosialis, mereka sering membayangkan kendali penuh pemerintah dan tanpa kepemilikan swasta. Namun dalam praktiknya, ekonomi sosialis sangat bervariasi.
“Children” merilis cameo dengan nama besar dan beberapa berita buruk
RAV4 ini diklaim dalam kondisi sangat baik dan siap digunakan untuk permainan kursi musik.
Rekaman drone memperlihatkan petugas pemadam kebakaran yang tampak kesulitan memadamkan api.
Eyes of Wakanda terhubung langsung dengan MCU, ditambah pembaruan tentang X-Men '97, What If..., Daredevil, dan banyak lagi.
'Laguna Beach' mengikuti kehidupan siswa sekolah menengah Lauren Conrad, Kristin Cavallari, Stephen Colletti, dan banyak lagi pada pertengahan tahun 2000-an. Berikut ini adalah tempat tinggal para pemeran serial realitas MTV tersebut sekarang.
Ava Gardner pernah menikah dengan Mickey Rooney dan Frank Sintra, dan ia pernah berpacaran dengan beberapa bintang Hollywood lainnya. Berikut ini kilas balik riwayat berpacaran Ava Gardner.
John Cleese menikahi istrinya, Jennifer Wade, pada tahun 2012. Berikut semua yang perlu Anda ketahui tentang istri John Cleese, Jennifer Wade.
Berikut semua yang perlu Anda ketahui tentang Francie Frane, mantan peternak yang menikah dengan Dog the Bounty Hunter.
Itu mengejutkan saya Tiba-tiba seperti yang sering terjadi Ini di tengah jalan lagi <Tidak, bukan yang di pasifik Anda merah marun, yang di karnaval> Setiap berita utama keras…..
Di tahun 2022, dengan dirilisnya GPT-3, kemampuan menulis sepertinya menjadi kurang penting. Dengan AI, orang dengan tulisan yang buruk juga dapat menghasilkan staf yang berkualitas.
Di dunia yang serba cepat dan kompetitif saat ini, karier seseorang memainkan peran penting dalam pertumbuhan pribadi, stabilitas keuangan, dan kepuasan hidup secara keseluruhan. Namun, banyak orang menemukan diri mereka terjebak dalam siklus stagnasi dan ketidakpuasan tanpa henti, secara bertahap menyia-nyiakan kehidupan profesional mereka.
Minggu lalu saya melihat siaran pers, dikirim melalui PressGazette (situs web berita media Inggris). Artikel tersebut mengumumkan bahwa Acast, perusahaan hosting dan periklanan podcast Scandi, akan memimpin konsorsium penerbit "mungkin yang paling berpengaruh" dalam podcasting.