我正在使用一个XML模式文档来验证传入的数据文档,但是该模式在运行时的编译过程中似乎失败了,因为它引用了一个复杂类型,该类型是外部模式的一部分。外部架构在文档顶部的<xs:import>元素中指定。我认为这可能是一个访问问题,所以我将外部文档的副本移动到本地主机文件夹中。我得到了同样的错误,所以现在我想知道在使用<xs:import>元素时是否存在某种问题。
模式文档片段如下所示:
<xs:schema targetNamespace="http://www.smpte-ra.org/schemas/429-7/2006/CPL" xmlns:cpl="http://www.smpte-ra.org/schemas/429-7/2006/CPL" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
...
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="http://localhost/TMSWebServices/XMLSchema/xmldsig-core-schema.xsd"/>
...
<xs:element name="Signer" type="ds:KeyInfoType" minOccurs="0"/>
...
</xs:schema>我尝试用来运行这个的代码非常简单(从http://dotnetslackers.com/Community/blogs/haissam/archive/2008/11/06/validate-xml-against-xsd-xml-schema-using-c.aspx获得)
string XSDFILEPATH = @"http://localhost/TMSWebServices/XMLSchema/CPL.xsd";
string XMLFILEPATH = @"C:\foo\bar\files\TestCPLs\CPL_930f5e92-be03-440c-a2ff-a13f3f16e1d6.xml";
System.Xml.XmlReaderSettings settings = new System.Xml.XmlReaderSettings();
settings.Schemas.Add(null, XSDFILEPATH);
settings.ValidationType = System.Xml.ValidationType.Schema;
System.Xml.XmlDocument document = new System.Xml.XmlDocument();
document.Load(XMLFILEPATH);
System.Xml.XmlReader rdr = System.Xml.XmlReader.Create(new StringReader(document.InnerXml), settings);
while (rdr.Read())
{
}一切都很顺利,直到在while循环之前实例化XMLReader对象的那行代码。然后它会失败,并返回一个类型未声明的错误。它试图查找的类型KeyInfoType是在导入元素的一个文档中定义的。我已确保名称空间排列整齐。我想知道名称空间定义中的#符号是否导致了问题,但删除它们没有任何影响,它只是改变了错误的样子(即“未声明类型'http://www.w3.org/2000/09/xmldsig:KeyInfoType‘。”对比“未声明类型'http://www.w3.org/2000/09/xmldsig#:KeyInfoType‘”。)
我怀疑我遗漏了一些关于<xs:import>元素的处理。任何建议都非常受欢迎。谢谢!
发布于 2009-05-01 20:56:29
我认为你只需要添加一行代码就可以让它工作:
settings.ValidationFlags =
System.Xml.Schema.XmlSchemaValidationFlags.ProcessSchemaLocation;Marc
发布于 2009-05-08 17:42:22
好吧,这有点让人费解。我尝试了几种不同的方法,包括添加以下行:
settings.ValidationFlags |= System.Xml.Schema.XmlSchemaValidationFlags.ProcessSchemaLocation;我一直收到相同的错误:
Type 'http://www.w3.org/2000/09/xmldsig#:KeyInfoType' is not declared.该命名空间指定的文档为:
http://localhost/TMSWebServices/XMLSchema/xmldsig-core-schema.xsd可以从我所在的位置访问该文档,并且我可以在第152行找到(看似)有问题的KeyInfoType类型。
为了好玩,我检查了正在验证的文档,发现此类型的模式中定义的元素不在文档中。模式将其定义为可选的(minOccurs="0"),所以这不是问题所在。
当schmea文档导入外部模式文档时,框架编译该文档的能力似乎有些奇怪。有没有人见过这种行为?谷歌在这个问题上并没有证明是有成效的,尽管它确实给了我一堆建议去尝试。谢谢!
https://stackoverflow.com/questions/813198
复制相似问题