XSD XML分析xs:序列

时间:2014-07-18 01:46:49

标签: xml xsd xsd-validation

xs:sequence表示元素应该按顺序排列。假设我有xsd,如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="personinfo">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="firstname" type="xs:string"/>
        <xs:element name="country" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

以下哪两个XML是正确的?

<?xml version="1.0" encoding="UTF-8"?>
<personinfo>
  <firstname>Abc</firstname>
  <firstname>Xyz</firstname>

  <country>CountryOfAbc</country>
  <country>CountryOfXyz</country>
</personinfo>

<?xml version="1.0" encoding="UTF-8"?>
<personinfo>
  <firstname>Abc</firstname>
  <country>CountryOfAbc</country>

  <firstname>Xyz</firstname>
  <country>CountryOfXyz</country>
</personinfo>

3 个答案:

答案 0 :(得分:2)

都不是。

符合架构的是......

<?xml version="1.0" encoding="UTF-8"?>
<personinfo>
  <firstname>Abc</firstname>
  <country>CountryOfAbc</<country>
</personinfo>

...

<?xml version="1.0" encoding="UTF-8"?>
<personinfo>
  <firstname>Xyz</firstname>
  <country>CountryOfXyz</country>
</personinfo>

如果您在本地没有XML文档,则可以使用online XML validator根据XSD架构验证XML文档。

如果你真正想要的是一个或多个personinfo元素连续 - 例如......

<?xml version="1.0" encoding="UTF-8"?>
<people>
  <personinfo>
    <firstname>Abc</firstname>
    <country>CountryOfAbc</country>
  </personinfo>
  <personinfo>
    <firstname>Xyz</firstname>
    <country>CountryOfXyz</country>
  </personinfo>
</people>

...尝试这样的架构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="people">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="personinfo" minOccurs="1" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="firstname" type="xs:string"/>
              <xs:element name="country" type="xs:string"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

否则请参阅@kjhughes的答案,了解描述您在问题中提供的两个示例文档的模式。

答案 1 :(得分:2)

这两个XML文档实例都不会对该XSD有效。

此XML文档实例对您的XSD有效:

<personinfo>
    <firstname>Abc</firstname>
    <country>CountryOfAbc</<country>
</personinfo>

或者,您可以通过使用maxOccurs occurrence constraint来调整XSD以使您给定的两个XML文档实例有效。

第一个例子:

<xs:element name="personinfo">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string" maxOccurs="2"/>
      <xs:element name="country" type="xs:string" maxOccurs="2"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

第二个例子:

<xs:element name="personinfo">
  <xs:complexType>
    <xs:sequence maxOccurs="2">
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="country" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

答案 2 :(得分:2)

就个人而言,我更喜欢这样:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="personinfo">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="record" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="firstname" type="xs:string" />
              <xs:element name="country" type="xs:string" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

因此XML将是:

<personinfo>
    <record>
        <firstname>Abc</firstname>
        <country>CountryOfAbc</country>
    </record>
    <record>
        <firstname>Xyz</firstname>
        <country>CountryOfXyz</country>
    </record>
</personinfo>