[英]Using .NET to validate XML against a schema
我想測試(true或false)任意XML文件是否與給定模式匹配。
對於它的價值,架構是Word 2003 WordML架構,Microsoft使用大約7 *.xsd
文件列表定義。
其中一個文件還包括W3C xml.xsd
文件,包括以下語句:
<xsd:import id="xml" namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="http://www.w3.org/2001/xml.xsd"></xsd:import>
我使用如下的.NET代碼進行驗證:
public static void validate(string filename)
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add(
"http://schemas.microsoft.com/office/word/2003/wordml",
//to get this file I downloaded "Office 2003: XML Reference Schemas", i.e. "Office2003XMLSchema.exe"
@"C:\Program Files\Microsoft Office 2003 Developer Resources\Microsoft Office 2003 XML Reference Schemas\WordprocessingML Schemas\wordnet.xsd"
);
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler += new ValidationEventHandler(validationEventHandler);
XmlReader xmlReader = XmlReader.Create(filename, settings);
while (xmlReader.Read()) { }
}
我的問題是,如果我在沒有連接到互聯網的機器上運行此代碼,那么我得到一個XmlSchemaValidationException
錯誤,它無法找到xml.xsd
。
為了解決這個問題,我下載了xml.xsd的副本,並使用settings.Schemas.Add
方法顯式添加:當機器未連接到互聯網時,驗證現在可以正常工作。
但是當機器連接到互聯網時,我現在收到一條錯誤消息,說明The global attribute 'http://www.w3.org/XML/1998/namespace:lang' has already been declared.
。
所以顯然我需要明確地添加它,或者我不需要,這取決於機器是否能夠從互聯網上靜默下載(或者甚至可能以前能夠下載它,並將其緩存到某處)。
所以,如果我這樣做,那就是“該死的,如果我不這樣做,該死的”。 我是否需要以一種方式嘗試,捕獲異常,然后以其他方式嘗試? 還是有更優雅的解決方案?
我們看不到您的代碼,但
在許多實現中,這是通過使用目錄解析器將.xsd的請求重定向到本地副本來處理的。 有一個屬性XmlReaderSettings.XmlResolver可用於此。 有關可以使用的Apache許可實現,請參閱XMLCatalog.net 。
這樣做的副作用是您可以保留所有本地緩存的模式。 這一點尤為重要,因為W3C會阻止對其網站的過度讀取,並且隨機地將您的代碼(或者更糟糕的是,您的客戶代碼)開始失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.