簡體   English   中英

使用.NET根據模式驗證XML

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM