欲测试(真或假)的任意的XML文件是否一个给定的模式相匹配。

有关它的价值,该架构是Word 2003中的WordML的架构,微软定义了使用的约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 那可以用于此目的。请参见 XMLCatalog.net 一个Apache授权的实现就可以使用。

这方面的一个副作用是,你可以保持本地缓存的所有模式。这一点尤其重要,因为W3C将阻止过度读取到他们的网站,并随机代码(或更糟的是,你的客户的代码)将开始失败。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top