【问题标题】:XML Validation : the element 'order' in namespace 'ordersSchema' has invalid child element 'deliveryAddress'XML 验证:命名空间“ordersSchema”中的元素“order”具有无效的子元素“deliveryAddress”
【发布时间】:2014-12-26 11:44:38
【问题描述】:

我必须制作一个 XSD 文件来验证某个 XML 文件,我认为它的路径不错,但我被卡住了,我已经查看我的代码好几天了,所以现在我正在寻找一个可以查看我的代码的文件具有新视图的代码,我在需要更改代码的地方包含了我的架构

我在 Visual Studio 中遇到的错误:警告 1 命名空间“OrdersSchema”中的元素“orders”在命名空间“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>

【问题讨论】:

  • 错误消息表明验证器需要一个orderAdress 元素(orderAddress 拼写错误?这是我能想到的唯一解释,因为orderAdress 不会出现在您的 XSD 中的任何位置。
  • 你好,我今天又试了一次,我得到了错误复制现在我想我在我的问题中犯了拼写错误

标签: xml validation namespaces parent-child


【解决方案1】:

您看到的特定错误是因为:

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

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

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

  • 如果它是顶级的&lt;element&gt;(即它直接在&lt;schema&gt; 元素内),那么它的命名空间就是targetNamespace 中指定的URI。
  • 对于非顶级&lt;elements&gt;
    • 如果它有一个值为qualifiedform 属性,那么它的命名空间就是targetNamespace 中指定的URI。
    • 如果它没有form 属性,并且&lt;schema&gt; 元素有一个elementFormDefault 属性值为qualified,那么它的命名空间就是targetNamespace 中指定的URI
    • 否则它没有命名空间。

可能对您来说最好的做法是将elementFormDefault 更改为qualified。一旦你这样做了,你会看到新的错误,因为现在所有你的元素都将有一个命名空间,除了ordersorder之外你没有任何前缀,但希望这会给您需要推动其余的事情。

【讨论】:

  • 同样,您可能想要attributeFormDefault="qualified",因为这意味着您需要将属性命名为os:orderId,而不仅仅是orderId。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多