Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用.NET根据架构验证XML_.net_Xml_Xsd_Xml Validation - Fatal编程技术网

使用.NET根据架构验证XML

使用.NET根据架构验证XML,.net,xml,xsd,xml-validation,.net,Xml,Xsd,Xml Validation,我想测试(true或false)任意XML文件是否与给定的模式匹配 值得一提的是,该模式是Word 2003 WordML模式,Microsoft使用大约7个*.xsd文件的列表定义了该模式 其中一个文件还包括W3Cxml.xsd文件,包括以下语句: <xsd:import id="xml" namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"

我想测试(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>
我的问题是,如果我在未连接到internet的机器上运行此代码,则会出现
XmlSchemaValidationException
错误,其结果是找不到
xml.xsd

为了解决这个问题,我下载了xml.xsd的一个副本,并使用
settings.Schemas.add
方法显式添加它:当机器未连接到internet时,验证现在可以正常工作

但是,当机器连接到internet时,我现在收到一个错误,表示
全局属性'http://www.w3.org/XML/1998/namespace:lang'已声明。

所以很明显,我要么需要显式地添加它,要么不添加,这取决于机器是否能够从internet无声地下载它(或者甚至可能以前能够下载它,并将它缓存在某个地方)

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

我们看不到您的代码,但在许多实现中,这是通过使用目录解析程序将.xsd请求重定向到本地副本来处理的。有一个属性可用于此操作。有关可以使用的Apache许可实现,请参阅


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

感谢您的建议;我将尝试使用子类
System.Xml.xmlsolver
,看看是否可以修复它。我以前失败过,因为我分配给
XmlReaderSettings.xmlsolver
属性;但是,当/因为我使用的是
settings.Schemas.Add
,因此我需要分配给
settings.Schemas.XmlResolver
属性。@ChrisW:我还收到错误“全局属性“”已经声明了”,代码与您原来的问题类似。您是否将settings.Schemas.xmlsolver设置为XMLCatalogResolver或其他内容?我试过了,但运气不好。你能粘贴你的工作代码吗?嗨,克里斯,你在哪里找到单词MLXSD的?
   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()) { }
   }