微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用.NET根据模式验证XML

我想测试(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方法显式添加:当机器未连接到互联网时,验证现在可以正常工作.

但是当机器连接到互联网时,我现在得到一个错误,称全局属性“http://www.w3.org/XML/1998/namespace:lang”已经被声明..

显然,我需要明确添加它,或者我不这样做,这取决于机器是否能够从互联网上静下载(或者甚至可能已经能够下载它,并且在某个地方缓存).

所以,如果我不做,那就是“死了”我需要尝试一种方式,抓住异常,然后尝试其他方法吗?还是有更优雅的解决方案?

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

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

原文地址:https://www.jb51.cc/xml/292316.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。