【问题标题】:XmlSchemaValidationException: The 'B' element is not declaredXmlSchemaValidationException:未声明“B”元素
【发布时间】:2012-01-06 08:33:33
【问题描述】:

我正在使用 XmlReader 针对 Xsd 验证 Xml。

当我验证这个 xml 时

<?xml version="1.0" encoding="utf-8" ?>
<A><B>sdf</B></A>

针对此架构:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="B" type="xs:string" />

<xs:element name="A">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="B"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

</xs:schema>

验证没问题。

但是如果我添加命名空间:

<?xml version="1.0" encoding="utf-8" ?>
<A xmlns="myns"><B>sdf</B></A>

和相应的架构:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="myns">

<xs:element name="B" type="xs:string" />

<xs:element name="A">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="B"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

</xs:schema>

我接受 System.Xml.Schema.XmlSchemaValidationException:未声明“B”元素。 为什么会发生这种情况?以及如何添加命名空间?

【问题讨论】:

    标签: c# .net xml xsd


    【解决方案1】:

    您收到验证错误的原因是您的架构实际上是两个架构。您有两个根元素,A 和 B。根元素不能隐式用作类型。您需要告诉 XSD 您要使用来自另一个模式的类型(使用导入),或者使这些类型成为模式的本地类型(使用 complexType 定义)。

    示例:将 B 提取到它自己的架构中。它不能共享同一个命名空间:

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="myns2">
      <xs:element name="B" type="xs:string" />
    </xs:schema>
    

    然后您可以使用 import 从您的 A 类型中引用 B:

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="myns" xmlns:myns2="myns2">
    
      <xs:import namespace="myns2" />
    
      <xs:element name="A">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="myns2:B" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    这允许您拥有以下有效的 XML 实例:

    <?xml version="1.0" encoding="utf-8" ?>
    <A xmlns="myns">
      <B xmlns="myns2">sdf</B>
    </A>
    

    您能够验证类型的非命名空间版本的原因是,为了成为有效的 XML,需要满足以下两个条件:

    • 格式良好的 XML
    • 必须符合任何引用的架构类型

    在非命名空间的 XML 文件中,根据定义没有对任何模式类型的引用,因此该文档是有效的 XML。

    【讨论】:

    • +1 建议从模式 A 中提取模式 B。它帮助了我! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2016-04-21
    • 2017-07-15
    • 2011-10-10
    • 1970-01-01
    相关资源
    最近更新 更多