XML验证:命名空间'ordersSchema'中的元素'order'具有无效的子元素'deliveryAddress'

时间:2014-12-26 11:44:38

标签: xml validation namespaces parent-child

我必须制作一个XSD文件来验证某个XML文件我觉得我走的路很好但是我卡住了我已经看了几天我的代码而迷路所以现在我正在寻找一个可以用新视图查看我的代码,我包含了我需要更改代码的Schema

我在visual studio中遇到的错误:警告1元素'命令'在命名空间' OrdersSchema'具有无效的子元素' order'在命名空间' OrdersSchema'。预期可能元素的列表:' order'。 Desktop \ xml \ Orders.Valid.01.xml 3 4其他文件

<?xml version="1.0" encoding="utf-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:os="OrdersSchema"
        targetNamespace="OrdersSchema"
        elementFormDefault="unqualified"
        attributeFormDefault="qualified">
  <element name="orders"    type="os:orders"/>
  <complexType name="orders">
    <sequence>
      <element name="order" type="os:order" maxOccurs="unbounded"/>
    </sequence>
  </complexType>
  <complexType name="order">
    <sequence>
      <element name="deliveryAddress">
        <complexType>
          <sequence>
            <element name='line1' type='os:lineType'/>
            <element name='line2' type='os:lineType'/>
            <element name='line3' type='os:lineType'/>
            <element name='line4' type='os:lineType' minOccurs='0'/>
          </sequence>
          <attribute name="orderId" type="string" use="required" >
          </attribute>
          <attribute name="type" type="os:typeType" use="required"/>
        </complexType>
        <unique name="uniqueOrderIdPerOrder">
          <selector xpath="os:order"/>
          <field xpath="orderId"/>
        </unique>
      </element>
      <element name='items'>
        <complexType>
          <attribute name='productId' type='os:productIdType'/>
          <attribute name='quantity'>
            <simpleType>
              <restriction base='positiveInteger'>
              </restriction>
            </simpleType>
          </attribute>
        </complexType>
      </element>
      <element name='note' minOccurs='0' type='string'/>
    </sequence>
  </complexType>
  <simpleType name='lineType'>
    <restriction base='string'>
      <minLength value='1'/>
    </restriction>
  </simpleType>
  <simpleType name='typeType'>
    <restriction base='string'>
      <enumeration value='standard'/>
      <enumeration value='express'/>
    </restriction>
  </simpleType>
  <simpleType name='productIdType'>
    <restriction base='string'>
      <pattern value='(?i)p[-\s](150|1[0-4][0-9]|[[1-9][0-9]|[1-9])\.[a-z][a-z][a-z][a-z][a-z][a-z]'/>
      <pattern value='A...+[$XYZ]\b'/>
    </restriction>
  </simpleType>    
</schema>

这是XML文件,如果有人愿意尝试自己

<?xml version="1.0" encoding="utf-8" ?>
<os:orders xmlns:os="OrdersSchema">
<os:order orderId="ord0001" type="standard">
<deliveryAddress>
  <line1>5, Elmstreet</line1>
  <line2>90210 Beverly Hills</line2>
  <line3>California</line3>
</deliveryAddress>
<items>
  <item productId="P 150.aabaac" quantity="5" />
</items>
<note>Deliver after 5 pm.</note>
</os:order>
<os:order orderId="ord0003" type="express">
<deliveryAddress>
  <line1>Voskenslaan 30</line1>
  <line2>BE9000 Gent</line2>
  <line3>Oost-Vlaanderen</line3>
  <line4>Belgium</line4>
</deliveryAddress>
<items>
  <item productId="A3546sdfsdf6546sdf654Z" quantity="10" />
  <item productId="p 149.SLKDOZ" quantity="5" />
  <item productId="P 100.xcvZEr" quantity="15" />
</items>
</os:order>
<os:order orderId="ord0002" type="express">
<deliveryAddress>
  <line1>Voskenslaan 32</line1>
  <line2>BE9000 Gent</line2>
  <line3>Oost-Vlaanderen</line3>
  <line4>Belgium</line4>
</deliveryAddress>
<items>
  <item productId="P-99.ruioze" quantity="15" />
  <item productId="A123qze46548X" quantity="50" />
  <item productId="P 1.sqmfze" quantity="1" />
  <item productId="AoknY" quantity="20" />
</items>
<note>This is <b>very urgent</b> !</note>
</os:order>
</os:orders>

1 个答案:

答案 0 :(得分:0)

您看到的特定错误正在发生,因为:

  • elementFormDefault="unqualified"元素中有<schema>(这是默认值)
  • orders之外的所有元素都在XSD的其他结构中声明(在其他类型或元素中)。

结果是ordersOrdersSchema命名空间中唯一的元素,其余的没有命名空间。

XSD中声明的元素的rules for determining the namespace如下:

  • 如果它是顶级<element>(即它位于<schema>元素内),则其命名空间是targetNamespace中指定的URI。
  • 对于非顶级<elements>
    • 如果它的form属性值为qualified,则其命名空间是targetNamespace中指定的URI。
    • 如果它没有form属性,<schema>元素的elementFormDefault属性值为qualified,则其命名空间是{{1}中指定的URI }}
    • 否则它没有命名空间。

对您而言,最好的做法可能是将targetNamespace更改为elementFormDefault。执行此操作后,您会看到新的错误,因为现在所有元素都将具有命名空间,除了qualifiedorders之外,您没有任何前缀,但希望这能为你提供所需的推动力,以便完成其余工作。