Странная XML-схема - PullRequest
       9

Странная XML-схема

4 голосов
/ 02 ноября 2009

Хорошо, поэтому мне было поручено написать XSD из XML-документа, предоставленного нам поставщиком. У этого поставщика нет XSD, который они могут предоставить, поэтому я занимаюсь обратным проектированием. Вот пример того, как формируется этот xml:

<field name="id">1</field>
<field name="Sport">Football</field>
<field name="Position">Quarterback</field>
<field name="Touchdowns">7</field>
<field name="Interceptions">2</field>
<field name="Yardage">2000</field>

Итак, поскольку все элементы названы «полем», у меня возникли проблемы при создании схемы для этого. Это то, что я до сих пор:

<xs:element name="field" type="xs:int">
     <xs:simpletype>
         <xs:attribute name="name" type="xs:string" default="id"/>
     </xs:string>
</xs:element>

Проблема, с которой я сталкиваюсь, заключается в том, что все элементы будут иметь одинаковые имена. Программное обеспечение, которое я использую для написания xsd, имеет проблемы с этим. У меня есть правильный подход здесь?

Спасибо за любую помощь.

Ответы [ 2 ]

5 голосов
/ 02 ноября 2009

Значение по умолчанию для maxOccurs вашего field элемента равно 1 (поэтому попробуйте установить его как неограниченное), также, simpleType может не содержать атрибутов или подэлементов.

Я считаю, что работает следующий пример:

XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="fields">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="field"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="field">
    <xs:complexType>
        <xs:attribute name="name" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

XML:

<?xml version="1.0" ?>
<fields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="fields.xsd">
    <field name="id">1</field>
    <field name="Sport">Football</field>
    <field name="Position">Quarterback</field>
    <field name="Touchdowns">7</field>
    <field name="Interceptions">2</field>
    <field name="Yardage">2000</field>
</fields>

Я использовал xs: string в типе name, но я думаю, вы могли бы определить новый тип данных для принудительного применения только определенных ключевых слов ...

2 голосов
/ 02 ноября 2009

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

<xsd:complexType name="field">
    <xsd:simpleContent>
        <xsd:extension>
            <xsd:attribute name="name" />
        </xsd:extension>
    </xsd:simpleContent>
</xsd:complexType>

для определения базового элемента с именем атрибута (без ограничений на тип атрибута). Это проверит все примеры в оригинальном сообщении.

тогда вы можете попробовать расширить это:

<xsd:complexType name="idField">
    <xsd:complexContent>
        <xsd:extension base="field">
            ...restrict it in here
        </xsd:extension>
    <xsd:complexContent>
</xsd:complexType>

И делать что-то подобное для каждого варианта, по существу делая их подтипами основного определения.

Я понимаю, что этот «ответ» на самом деле не дает окончательного ответа, но, надеюсь, он подтолкнет вас в правильном направлении.

Если это не удастся, я не вижу, что вы можете сделать, кроме как заставить продавца переписать их XML.

...