使用嵌套 XSD 架构的 XML 验证错误 - 类型未声明

发布于 2024-12-05 20:57:18 字数 2277 浏览 0 评论 0原文

我正在使用嵌套的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

╄→承喏 2024-12-12 20:57:18

经过一天半的令人沮丧的迭代后,我发现了这个问题。改变:

FileStream fs = new FileStream(xsdPath, FileMode.Open);
XmlReader reader = XmlReader.Create(fs);
XmlSchemaSet xss = new XmlSchemaSet();
xss.Add("", reader);

解决

XmlSchemaSet xss = new XmlSchemaSet();
xss.Add("", xsdPath);

问题。但我仍在寻找“为什么”的答案?两者都是将模式添加到模式集的有效方法(即 2 个重载)。

I have found the problem after a frustrating day and a half of iterations. Changing:

FileStream fs = new FileStream(xsdPath, FileMode.Open);
XmlReader reader = XmlReader.Create(fs);
XmlSchemaSet xss = new XmlSchemaSet();
xss.Add("", reader);

to

XmlSchemaSet xss = new XmlSchemaSet();
xss.Add("", xsdPath);

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).

卷耳 2024-12-12 20:57:18

arootbeer 关于您的 xsd 如何导入另一个 xsd 的说法是正确的。然而,另一种解决方案是首先将导入的 xsd 添加到 XmlSchemaSet 中,然后添加正在执行实际导入的 xsd。

//Xsd file that is being imported
FileStream importedXsdStream = new FileStream(importedXsdPath, FileMode.Open);
XmlReader xmlReader = XmlReader.Create(importedXsdStream);
XmlSchemaSet xmlSchemaSet = new XmlSchemaSet();
xmlSchemaSet.Add("NameSpace.SomeNameSpace", xmlReader);

//Your code
FileStream fs = new FileStream(xsdPath, FileMode.Open);
XmlReader reader = XmlReader.Create(fs);
XmlSchemaSet xss = new XmlSchemaSet();
xss.Add("", reader);

请注意,将导入的 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.

//Xsd file that is being imported
FileStream importedXsdStream = new FileStream(importedXsdPath, FileMode.Open);
XmlReader xmlReader = XmlReader.Create(importedXsdStream);
XmlSchemaSet xmlSchemaSet = new XmlSchemaSet();
xmlSchemaSet.Add("NameSpace.SomeNameSpace", xmlReader);

//Your code
FileStream fs = new FileStream(xsdPath, FileMode.Open);
XmlReader reader = XmlReader.Create(fs);
XmlSchemaSet xss = new XmlSchemaSet();
xss.Add("", reader);

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文