【问题标题】:The element A in namespace B has invalid child element C in namespace D命名空间 B 中的元素 A 在命名空间 D 中具有无效的子元素 C
【发布时间】:2014-10-31 07:28:06
【问题描述】:

我在验证 XML 时收到以下错误

命名空间“http://www.test.com/test”中的元素“根”无效 命名空间“http://www.test.com/test”中的子元素“学生”。列表 预期的可能元素数:“学生”。

我无法发布实际的 XSD,但我准备了一个小型 XSD 来复制该问题。另外,我无法控制 XSD,因为它是由客户端提供的。示例 XSD 如下所示。

<xs:schema xmlns:stu="http://www.test.com/test" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema"      
           targetNamespace="http://www.test.com/test" 
           elementFormDefault="unqualified" 
           attributeFormDefault="unqualified" 
           version="1.2">
<xs:element name="Root">
<xs:complexType>
  <xs:sequence>
    <xs:element name="Student" type="stu:Student" minOccurs="1" maxOccurs="1">          
    </xs:element>
  </xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="Date">
  <xs:restriction base="xs:date">
    <xs:minInclusive value="0001-01-01"/>
    <xs:maxInclusive value="9999-12-31"/>
    <xs:pattern value="\p{Nd}{4}-\p{Nd}{2}-\p{Nd}{2}"/>
  </xs:restriction>
</xs:simpleType>
<xs:simpleType name="String100">
  <xs:restriction base="xs:string">
    <xs:maxLength value="100"/>
    <xs:minLength value="1"/>
  </xs:restriction>
</xs:simpleType>
<xs:complexType name="Student">
  <xs:sequence>
    <xs:element name="StudentName" type="stu:String100" nillable="false"/>
    <xs:element name="AdmissionDate" type="stu:Date" nillable="false"/>
  </xs:sequence>
</xs:complexType>
</xs:schema>

我根据提供的 XSD 和我拥有的数据生成 XML。 XML 生成如下。

<?xml version="1.0" encoding="utf-8"?>
<Root xmlns="http://www.test.com/test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Student>
        <StudentName>StudentName1</StudentName>
        <AdmissionDate>2010-01-01</AdmissionDate>
    </Student>
</Root>

我在 stackoverflow The element "x" in namespace "xSchema" has invalid child element "y" in namespace "xSchema". List of possible elements expected: "y" 上检查了这个线程,但它指出我们应该删除前缀使用

<order> 

而不是

<os:order>. 

但在我的例子中,XML 已经像这样生成了。我该如何克服这个问题?

我还使用 XSD 中的 Visual Studio 生成了示例 XML,看看有什么不同。验证的示例 XML 只有一行不同

<?xml version="1.0" encoding="utf-8"?>
<Root xmlns="http://www.test.com/test">
   <Student xmlns=""> <!-- JUST THIS xmlns="" ADDED prevents the issue -->
     <StudentName>StudentName1</StudentName>
     <AdmissionDate>2010-01-01</AdmissionDate>
   </Student>
</Root>

添加 xmlns="" 有什么不同?我正在寻找替代解决方案和问题的原因。请帮忙。

【问题讨论】:

    标签: c# xml xsd


    【解决方案1】:

    这是一个很好的问题,因为它触及了 xml 命名空间如何工作的核心。

    必须在 Student 元素上设置 xmlns="" 的原因是架构指定了 elementFormDefault="unqualified",这意味着在 Root 元素下声明的任何元素都驻留在“null”命名空间中。

    您想要的实例:

    <Root xmlns="http://www.test.com/test">
      <Student>
        <StudentName>f</StudentName>
        <AdmissionDate>0001-01-01</AdmissionDate>
      </Student>
    </Root>
    

    不会验证,因为 Student 从 Root 继承了它的命名空间,并且在架构中,Student 不属于这个命名空间。

    因此,您有两个选择,将xmlns="" 添加到 Student 节点(正如您已经发现的那样),或者在您的实例中使用命名空间前缀:

    <x:Root xmlns:x="http://www.test.com/test">
      <Student>
        <StudentName>f</StudentName>
        <AdmissionDate>0001-01-01</AdmissionDate>
      </Student>
    </x:Root>
    

    此外,如果您的客户将架构更改为 elementFormDefault="qualified",那么您所需的实例表单将是有效的。

    【讨论】:

    • 非常感谢。 :) 我现在将使用第二个选项。对不起,我对 XML 和 XSD 的了解有限。但是如果我使用第二个选项并且明天客户更改 elementFormDefault="qualified",我想这将再次开始破坏。然后当前输出将生效,但这将开始中断。对吗?
    • 是的,这是正确的。更改为 elementFormDefault="qualified" 将要求 Student 与 Root 属于同一命名空间。
    • 再次感谢。我也测试过
    • 再次查看架构 - 我认为您的客户在这里犯了一个错误 - 我认为他们显然打算让 Student 元素属于命名空间。我会向他们澄清这一点,因为现在改变它比在 6 个月内忘记这一切时更容易!
    • 谢谢。但我正在动态生成 XML。所以无论如何,我都需要处理这两种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    相关资源
    最近更新 更多