使用嵌套 XSD 架构的 XML 验证错误 - 类型未声明
我正在使用嵌套的 XSD 架构来验证 XML 文档。导入的 XSD 使用它们自己的目标命名空间,我可以使用 Liquid XML Studio 验证下面给出的示例 XML。但是,当我使用下面的 C# 代码运行验证时,它失败并出现类型声明错误(见下文)。我花了很多时间试图弄清楚,但没有运气:
主要 XSD 架构 (DataItem.xsd):
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:DataNumeric="Doc.DataNumeric" xmlns:DataYesNo="Doc.DataYesNo" attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import schemaLocation="DataNumeric.xsd" namespace="Doc.DataNumeric" />
<xs:import schemaLocation="DataYesNo.xsd" namespace="Doc.DataYesNo" />
<xs:complexType name="tDataItem">
<xs:choice>
<xs:element name="DataNumeric" type="DataNumeric:tDataNumeric" />
<xs:element name="DataYesNo" type="DataYesNo:tDataYesNo" />
</xs:choice>
</xs:complexType>
<xs:element name="DataItem" type="tDataItem" />
</xs:schema>
包含的 XSD 架构 (DataNumeric.xsd):
**<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:DataNumeric="Doc.DataNumeric" elementFormDefault="qualified" targetNamespace="Doc.DataNumeric" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="tDataNumeric">
<xs:sequence>
<xs:element name="Answer" type="xs:double" />
</xs:sequence>
</xs:complexType>
<xs:element name="DataNumeric" type="DataNumeric:tDataNumeric" />
</xs:schema>**
XML:
<DataItem>
<DataNumeric xmlns:DataNumeric="Doc.DataNumeric">
<DataNumeric:Answer>37.8</DataNumeric:Answer>
</DataNumeric>
</DataItem>
验证错误:
XmlSchemaValidationException:未声明类型“Doc.DataNumeric:tDataNumeric”。
C# 验证代码:
XDocument xDoc = XDocument.Parse(xxxxxxx);
string xsdPath = ConfigUtils.GetXsdPath(XsdSchemaIdentifier.HHDataItem);
FileStream fs = new FileStream(xsdPath, FileMode.Open);
XmlReader reader = XmlReader.Create(fs);
XmlSchemaSet xss = new XmlSchemaSet();
xss.Add("", reader);
fs.Close();
fs.Dispose();
xDoc.Validate(xss, null);
I am using a nested XSD schema to validate an XML document. The imported XSDs use their own target namespaces and I can validate the sample XML given below using Liquid XML Studio. But when I run the validation using my C# code below, it fails with the type declaration error (see below). I have spend alot of time trying to figure out, but no luck:
Main XSD Schema (DataItem.xsd):
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:DataNumeric="Doc.DataNumeric" xmlns:DataYesNo="Doc.DataYesNo" attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import schemaLocation="DataNumeric.xsd" namespace="Doc.DataNumeric" />
<xs:import schemaLocation="DataYesNo.xsd" namespace="Doc.DataYesNo" />
<xs:complexType name="tDataItem">
<xs:choice>
<xs:element name="DataNumeric" type="DataNumeric:tDataNumeric" />
<xs:element name="DataYesNo" type="DataYesNo:tDataYesNo" />
</xs:choice>
</xs:complexType>
<xs:element name="DataItem" type="tDataItem" />
</xs:schema>
Included XSD Schema (DataNumeric.xsd):
**<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:DataNumeric="Doc.DataNumeric" elementFormDefault="qualified" targetNamespace="Doc.DataNumeric" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="tDataNumeric">
<xs:sequence>
<xs:element name="Answer" type="xs:double" />
</xs:sequence>
</xs:complexType>
<xs:element name="DataNumeric" type="DataNumeric:tDataNumeric" />
</xs:schema>**
The XML:
<DataItem>
<DataNumeric xmlns:DataNumeric="Doc.DataNumeric">
<DataNumeric:Answer>37.8</DataNumeric:Answer>
</DataNumeric>
</DataItem>
Validation Error:
XmlSchemaValidationException: Type 'Doc.DataNumeric:tDataNumeric' is not declared.
C# Validation Code:
XDocument xDoc = XDocument.Parse(xxxxxxx);
string xsdPath = ConfigUtils.GetXsdPath(XsdSchemaIdentifier.HHDataItem);
FileStream fs = new FileStream(xsdPath, FileMode.Open);
XmlReader reader = XmlReader.Create(fs);
XmlSchemaSet xss = new XmlSchemaSet();
xss.Add("", reader);
fs.Close();
fs.Dispose();
xDoc.Validate(xss, null);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
经过一天半的令人沮丧的迭代后,我发现了这个问题。改变:
解决
问题。但我仍在寻找“为什么”的答案?两者都是将模式添加到模式集的有效方法(即 2 个重载)。
I have found the problem after a frustrating day and a half of iterations. Changing:
to
solved the problem. However I am still looking for the answer to WHY? Both are valid ways of adding a schema to the schema set (i.e. 2 overloads).
arootbeer 关于您的 xsd 如何导入另一个 xsd 的说法是正确的。然而,另一种解决方案是首先将导入的 xsd 添加到 XmlSchemaSet 中,然后添加正在执行实际导入的 xsd。
请注意,将导入的 xsd 添加到 XmlSchemaSet 时,我将命名空间作为第一个参数。这可能是必要的,具体取决于目标命名空间是否存在与导入的 xsd 中提供的命名空间不匹配的错误。
arootbeer is right about how your xsd imports another xsd. However another solution is to add the the imported xsd into the XmlSchemaSet first, then add the xsd that is doing the actual importing.
Notice I put the Namespace as the first parameter when adding the imported xsd to the XmlSchemaSet. This may be necessary depending on if there are errors with the target namespace not matching the namespace provided in the imported xsd.