我只关心XML文件中是否存在某些特定标记,而不关心其他标记。我应该如何撰写xml架构文件?

时间:2011-11-27 06:06:02

标签: xml xsd

例如,我只关心父标记“person”中是否存在某些必要的子标记,例如“name”,“sex”。并且这些“必要”标签的外观顺序不固定(但这些标签的名称是固定的)。

这没关系。

<person>
    <name>peter</name>
    <sex>male</sex>
</person>

这也没关系。虽然位置发生了变化

<person>
    <sex>male</sex>
    <name>peter</name>
</person>

这也没关系。(年龄,addr是不必要的,并允许在人的任何地方)

<person>
    <name>peter</name>
    <age>23</age>
    <addr>abc</addr>
    <sex>male</sex>
</person>

这并不好,因为其中一个必需的标签“name”不存在。

<person>
    <age>23</age>
    <sex>male</sex>
</person>

你能告诉我如何编写xml架构来检查这个吗? <xsd:sequence> ...似乎不适合这种情况。

此外: 事实上,除了标签“name”,“sex”之外,在父标签“person”中还有许多(低于20个)其他“必要”标签。

3 个答案:

答案 0 :(得分:2)

如果name元素必须首先出现,那么很容易实现这个内容模型:你定义一个由匹配名称的元素粒子组成的序列,然后是一个匹配任何东西的(可选的,可重复的)通配符粒子(xs:any)。

如果name元素可以到达任何地方,那么实现它会更难;问题是在XSD 1.0中,内容模型最终不明确,因为当您遇到name元素时,它会匹配name的特定元素粒子和通配符。 XSD 1.1通过允许这种模糊性来巧妙地解决这个问题:元素将优先匹配特定粒子而不是外卡。所以在XSD 1.1中你可以写

<xs:sequence>
  <xs:any minOccurs="0" maxOccurs="unbounded"/>
  <xs:element name="name"/>
  <xs:any minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>

可能有另一种方法可行:使内容模型完全打开,但定义“名称”必须唯一的唯一性约束。这意味着名称必须存在。

答案 1 :(得分:0)

可能想要这样的东西:

<xs:element name="name" type="xs:string" minOccurs="1" />

在复杂类型规范中。所以像这样:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="person">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="name" type="xs:string" minOccurs="1" />
              <xs:any minOccurs ="0" maxOccurs ="unbounded" processContents="lax"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

前两个示例通过,但第三个示例失败。

答案 2 :(得分:0)

使用序列,然后使用xsd:any

<xsd:element name="person">
    <xsd:complexType>
        <xsd:sequence>
        <xsd:element name="name" type="xsd:string" />
        <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

不幸的是,你必须以“name”元素开头。