【问题标题】:Simple XML Schema to XSD validation简单 XML Schema 到 XSD 验证
【发布时间】:2017-04-17 23:53:21
【问题描述】:

我试图找出解决这个问题的方法,但似乎找不到。 这只是一个简单的 XSD、XML 文件格式。 我不断收到的错误是:错误:元素“联系人”:此元素不是预期的。

XML:

<?xml version="1.0" encoding="UTF-8"?>
<address xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"si:noNamespaceSchemaLocation="address.xsd">
     <contact>
        <name>Hana Song</name>
        <phone>82-51-120</phone>
        <street>1001 Jungang-daero, Yeonje-gu</street>
        <city>Busan</city>
        <origin>Republic of Korea, South Korea</origin>
        <zip>47545</zip>
    </contact>
    <contact>
        <name>Genji Shimada</name>
        <phone>949-955-1380</phone>
        <street>1 Blizzard Way</street>
        <city>Irvine</city>
        <origin>CA, USA</origin>
        <zip>92618</zip>
    </contact>
    <contact>
        <name>Jesse McCree</name>
        <phone>800-777-2489</phone>
        <street>201 W. Marcy St.</street>
        <city>Santa Fe</city>
        <origin>NM, USA</origin>
        <zip>87501</zip>
    </contact>
</address>

XSD 文件:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!--definition of simple elements -->

    <xs:element name="name" type="xs:string"/>
    <xs:element name="phone" type="xs:string"/>
    <xs:element name="street" type="xs:string"/>
    <xs:element name="city" type="xs:string"/>
    <xs:element name="origin" type="xs:string"/>
    <xs:element name="zip" type="xs:string"/>

<!--definition of attributes elements -->

<!--definition of complex elements-->
    <xs:element name="address">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="contact"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="contact">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="name"/>
        <xs:element ref="phone"/>
        <xs:element ref="street"/>
        <xs:element ref="city"/>
        <xs:element ref="origin"/>
        <xs:element ref="zip"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

【问题讨论】:

    标签: xml xsd xsd-validation


    【解决方案1】:

    您的 XML 中有多个 contact 元素,但 Schema 只允许一个,因为有属性:

    minOccursmaxOccurs。默认情况下它们等于 1。

    所以...将您的架构更改为:

    <!--definition of complex elements-->
    <xs:element name="address">
      <xs:complexType>
        <xs:sequence>
         <xs:element ref="contact" minOccurs="1" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
    

    附:请记住 minOccurs="1" 至少需要一个元素。如果那里根本没有联系人,请发送minOccurs="0"

    另外不推荐使用 maxOccurs="unbounded",因为可能存在“无限 XML 攻击”。 最好将其设置为一些较大但实际的 maxValue。例如maxOccurs="1000"

    【讨论】:

    • 您的回答有助于更好地理解它。谢谢!
    • (也不推荐使用 maxOccurs="unbounded",因为可能存在“无限 XML 攻击”)。我强烈反对这个建议。首先,maxOccurs(或 minOccurs)的大有限值可能非常在某些处理器上很昂贵,这本身就是一种潜在的 DDoS 攻击。其次,不允许在某处使用无限值​​的模式确实会非常麻烦。第三,如果您想限制传入 XML 文档的大小,有更好的方法来做它:这不是 XML Schema 的工作。
    • 我不会争论...但我看到了这样的攻击。当然有很多更好的方法,它不是 XML Schema 的工作......但是恕我直言,当其他选项超出您的控制范围并且某人在某个地方没有正确完成他的工作时,它可能是最后一道防线...... (在大型组织中经常出现这种情况)。
    猜你喜欢
    • 2016-07-09
    • 2016-02-03
    • 2010-09-12
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    相关资源
    最近更新 更多