我一直在网上搜索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设置的每个组合,并且已经通过搜索建议了。
我现在真的很难受。
你写了:
当我运行它时,我得到:没有声明
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
。
跳过此验证的一种简单方法是在xmldsig-core-schema.xsd上注释第一行(DTD部分)
XMLSchema.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 ''>
]>-->
架构添加到XmlReaderSettings时,我收到以下消息:
出于安全原因,此XML文档中禁止使用DTD。要启用DTD处理,请将XmlReaderSettings上的DtdProcessing属性设置为Parse,并将设置传递给XmlReader.Create方法。
以下代码是需要的:
xmldsig-core-schema.xsd
我认为编写代码可能有更为雄辩和简洁的方式,但我花了很长时间才开始使用它我很高兴它的工作原理。如果有人想编辑它,请随意。