需要名称未知的元素的属性?
Require attributes on elements with unknown names?
我想用未知命名元素编写 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>
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可以很容易地写成XSD1.0来解决你的顾虑:
<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>
我想用未知命名元素编写 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>
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可以很容易地写成XSD1.0来解决你的顾虑:
<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>