代码之家  ›  专栏  ›  技术社区  ›  ChrisW

使用.NET根据架构验证XML

  •  10
  • ChrisW  · 技术社区  · 14 年前

    我想测试(true或false)任意XML文件是否与给定的模式匹配。

    值得一提的是,这个模式是word2003wordml模式,微软使用大约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 .

    settings.Schemas.Add 方法:当机器未连接到internet时,验证现在可以正常工作。

    但是,当机器连接到internet时,我现在得到一个错误,即 The global attribute 'http://www.w3.org/XML/1998/namespace:lang' has already been declared.

    所以,这是“该死的如果我做和该死的如果我不”。我是否需要尝试一种方法,捕获异常,然后再尝试另一种方法?还是有更优雅的解决方案?

    1 回复  |  直到 14 年前
        1
  •  4
  •   lavinio    14 年前

    我们看不到你的代码,但是 在许多实现中,这是通过使用目录解析器将对.xsd的请求重定向到本地副本来处理的。这里有一处房产 XmlReaderSettings.XmlResolver XMLCatalog.net 对于Apache许可的实现,您可以使用。

    这样做的一个副作用是,可以在本地缓存所有模式。这一点尤其重要,因为W3C会阻止对其站点的过度读取,并且随机地您的代码(或者更糟的是,您客户的代码)将开始失败。