2016-02-13 6 views
1

Я хочу написать 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> 
+0

Несколько заблуждений расчищать первый. В XML-схеме все элементы называются. Я подозреваю, что вы имеете в виду «элементы с неизвестными именами», а не «анонимные элементы». Во-вторых, в XML-схеме тип элемента определяет его содержимое. Вы не можете описать элемент с неизвестным именем, но известным контентом. Наконец, атрибут XML не может повторяться, поэтому maxOccurs = unbounded в объявлении атрибута является незаконным. – kimbert

+0

Спасибо, я отредактировал это. Итак, если я хочу иметь неизвестное количество атрибутов, я должен добавить их как внутренние теги? – Josephus87

ответ

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 можно легко записать в XSD 1.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> 
+0

ах да замечательно, мне было просто любопытно, если бы это было возможно. Основная проблема заключалась в том, чтобы иметь больше атрибутов, чем определено в XSD, без необходимости использовать внутренние теги. – Josephus87

Смежные вопросы