要求具有未知名称的元素的属性?

时间:2016-02-13 17:17:19

标签: xml xsd xsd-validation xml-validation

我想用未知的命名元素编写XML,其中包含一些已知属性和无限数量的未知属性。这是怎么做到的,如下所示?

XML

<Nodes>
 <COM.US.BattleShip UUID="adaKAj62ja" "X="4" Y="4" cannons="5" crew="50">
 <COM.US.Cruiser UUID="dhRTV53ga" "X="4" Y="4" destroyed="true">
</Nodes>

XSD

<xsd:element name="Nodes">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element>
        <xsd:complexType>
         <xsd:attribute name="UUID" type="xsd:string" use="required"/>
         <xsd:attribute name="X" type="xsd:int" use="required"/>
         <xsd:attribute name="Y" type="xsd:int" use="required"/>
         <xsd:attribute type="xsd:string" maxOccurs="unbounded"/>
        </xsd:complexType>
      </xsd:element>
     </xsd:sequence>
  </xsd:complexType>
</xsd:element>

1 个答案:

答案 0 :(得分:2)

XSD 1.0不能要求名称未知的元素使用属性。

您可以在XSD 1.1中编写断言,但实际上,您最好不要重新设计XML设计。您可以使用预定义的通用元素名称,而不是允许任何元素名称,以便您可以使用常规的XSD 1.0属性必需性约束。您可以将COM.US.BattleShip捕获为属性值,而不是元素名称

<Nodes>
  <Node name="COM.US.BattleShip" UUID="adaKAj62ja" X="4" Y="4" cannons="5" crew="50"/>
  <Node name="COM.US.Cruiser" UUID="dhRTV53ga" X="4" Y="4" destroyed="true"/>
</Nodes>

如果可以接受此XML设计,则可以在XSD 1.0中轻松编写XSD以涵盖您的问题:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Nodes">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Node" minOccurs="0" maxOccurs="unbounded">
          <xs:complexType>
            <xs:attribute name="name" type="xs:string" use="required"/>
            <xs:attribute name="UUID" type="xs:string" use="required"/>
            <xs:attribute name="X" type="xs:int" use="required"/>
            <xs:attribute name="Y" type="xs:int" use="required"/>
            <xs:anyAttribute processContents="skip"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>