加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用.NET根据模式验证XML

发布时间:2020-12-16 07:44:06 所属栏目:百科 来源:网络整理
导读:我想测试(true或false)是否任意的 XML文件与给定的模式匹配. 为什么值得,该模式是Word 2003 WordML模式,Microsoft定义使用大约7 * .xsd文件的列表. 其中一个文件还包括W3C xml.xsd文件,包括以下语句: xsd:import id="xml" namespace="http://www.w3.org/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 FilesMicrosoft Office 2003 Developer ResourcesMicrosoft Office 2003 XML Reference SchemasWordprocessingML Schemaswordnet.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将阻止对其网站的读取过多,随机的代码(或更糟的是您的客户代码)将开始失败.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读