首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中解析<xs:import >元素中的位置时出现问题

在C#中解析<xs:import >元素中的位置时出现问题
EN

Stack Overflow用户
提问于 2009-05-01 20:48:08
回答 2查看 1.2K关注 0票数 0

我正在使用一个XML模式文档来验证传入的数据文档,但是该模式在运行时的编译过程中似乎失败了,因为它引用了一个复杂类型,该类型是外部模式的一部分。外部架构在文档顶部的<xs:import>元素中指定。我认为这可能是一个访问问题,所以我将外部文档的副本移动到本地主机文件夹中。我得到了同样的错误,所以现在我想知道在使用<xs:import>元素时是否存在某种问题。

模式文档片段如下所示:

代码语言:javascript
复制
<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获得)

代码语言:javascript
复制
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>元素的处理。任何建议都非常受欢迎。谢谢!

EN

回答 2

Stack Overflow用户

发布于 2009-05-01 20:56:29

我认为你只需要添加一行代码就可以让它工作:

代码语言:javascript
复制
settings.ValidationFlags =  
      System.Xml.Schema.XmlSchemaValidationFlags.ProcessSchemaLocation;

Marc

票数 0
EN

Stack Overflow用户

发布于 2009-05-08 17:42:22

好吧,这有点让人费解。我尝试了几种不同的方法,包括添加以下行:

代码语言:javascript
复制
settings.ValidationFlags |= System.Xml.Schema.XmlSchemaValidationFlags.ProcessSchemaLocation;

我一直收到相同的错误:

代码语言:javascript
复制
Type 'http://www.w3.org/2000/09/xmldsig#:KeyInfoType' is not declared.

该命名空间指定的文档为:

代码语言:javascript
复制
http://localhost/TMSWebServices/XMLSchema/xmldsig-core-schema.xsd

可以从我所在的位置访问该文档,并且我可以在第152行找到(看似)有问题的KeyInfoType类型。

为了好玩,我检查了正在验证的文档,发现此类型的模式中定义的元素不在文档中。模式将其定义为可选的(minOccurs="0"),所以这不是问题所在。

当schmea文档导入外部模式文档时,框架编译该文档的能力似乎有些奇怪。有没有人见过这种行为?谷歌在这个问题上并没有证明是有成效的,尽管它确实给了我一堆建议去尝试。谢谢!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/813198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档