使用具有导入的xsd验证XML文档

问题描述 投票:1回答:3

我一直在网上搜索24小时,但是找不到有效的解决方案。

我有一个包含导入行的模式文件:

<xsd:import namespace="http://www.w3.org/2000/09/xmldsig#" 
            schemaLocation=
              "http://www.w3.org/TR/2001/PR-xmldsig-core-20010820/xmldsig-core-schema.xsd"/>

这是我验证Xml的代码:

XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.Schemas.Add(null, @"C:\TEMP\myschema.xsd");

XmlReader xmlReader = XmlReader.Create(new StringReader(document.InnerXml), settings);
while (xmlReader.Read()) { }

当我跑它时,我得到:The 'http://www.w3.org/2000/09/xmldsig#:Signature' element is not declared.

如果我将代码(如搜索建议)更改为:

settings.ValidationType = ValidationType.DTD;
settings.DtdProcessing = DtdProcessing.Parse;

然后我没有收到任何错误,但验证不起作用,因为我故意插入一个无效值来测试验证是否正常。

我已经尝试添加直接导入的模式:

settings.Schemas.Add(null, @"C:\TEMP\xmldsig-core-schema.xsd");

但收到错误:qazxsw poi

我已经尝试了我能想到的XmlReaderSettings设置的每个组合,并且已经通过搜索建议了。

我现在真的很难受。

c# xml xsd xsd-validation
3个回答
1
投票

你写了:

当我运行它时,我得到:没有声明For security reasons DTD is prohibited in this XML document. To enable DTD processing...元素。

看起来它无法通过该URL加载导入的模式:http://www.w3.org/2000/09/xmldsig#:Signature

我检查了那个URL,并且那里存在了模式,以及在其中声明了元素http://www.w3.org/TR/2001/PR-xmldsig-core-20010820/xmldsig-core-schema.xsd(全局)。

但是加载该模式需要相当长的时间,显然是因为W3C阻止(并且实际上阻碍)来自全球众多软件的XML资源的巨大流量。

关于这个:

但是收到错误:出于安全原因,此XML文档中禁止使用DTD。启用DTD处理...

我不确定你使用的是哪个编程系统(Java,.NET等),但它归结为它的设置,可以通过你的代码或一些配置文件或环境变量传递给它。

该模式确实包含对必须加载的某些DTD(XMLSchema.dtd)的引用:

{http://www.w3.org/2000/09/xmldsig#}Signature

我建议您也从该URL加载该DTD:<!DOCTYPE schema PUBLIC "-//W3C//DTD XMLSchema 200102//EN" "http://www.w3.org/2001/XMLSchema.dtd" [ <!ATTLIST schema xmlns:ds CDATA #FIXED 'http://www.w3.org/2000/09/xmldsig#'> <!ENTITY dsig 'http://www.w3.org/2000/09/xmldsig#'> <!ENTITY % p ''> <!ENTITY % s ''> ]> 并将其放在与架构相同的目录中。然后,编辑模式文件并将DTD位置更改为相同(作为模式):

http://www.w3.org/2001/XMLSchema.dtd

......并且<!DOCTYPE schema PUBLIC "-//W3C//DTD XMLSchema 200102//EN" "XMLSchema.dtd" [ .... 也将在当地需要http://www.w3.org/2001/datatypes.dtd


1
投票

跳过此验证的一种简单方法是在xmldsig-core-schema.xsd上注释第一行(DTD部分)

XMLSchema.dtd

0
投票

好设法搞清楚。一直盯着我的脸。

当我尝试将<!--<!DOCTYPE schema PUBLIC "-//W3C//DTD XMLSchema 200102//EN" "http://www.w3.org/2001/XMLSchema.dtd" [ <!ATTLIST schema xmlns:ds CDATA #FIXED "http://www.w3.org/2000/09/xmldsig#"> <!ENTITY dsig 'http://www.w3.org/2000/09/xmldsig#'> <!ENTITY % p ''> <!ENTITY % s ''> ]>--> 架构添加到XmlReaderSettings时,我收到以下消息:

出于安全原因,此XML文档中禁止使用DTD。要启用DTD处理,请将XmlReaderSettings上的DtdProcessing属性设置为Parse,并将设置传递给XmlReader.Create方法。

以下代码是需要的:

xmldsig-core-schema.xsd

我认为编写代码可能有更为雄辩和简洁的方式,但我花了很长时间才开始使用它我很高兴它的工作原理。如果有人想编辑它,请随意。

© www.soinside.com 2019 - 2024. All rights reserved.