2009-11-02 2 views
4

Итак, мне поручили написать XSD из XML-документа, предоставленного нам поставщиком. У этого поставщика нет XSD, который они могут предоставить, поэтому я занимаюсь разработкой технологии. Вот пример того, как формируется этот XML:Странная схема 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, имеет проблемы с этим. Есть ли у меня правильный подход?

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

+0

Не должен быть элемент поля типа e строка? – csl

+0

Нет, поскольку фактическое содержимое первого элемента было id, которое является int. – user201051

+0

Sry - должен быть более наглядным - пример xsd содержит только первый элемент (поле id) – user201051

ответ

2

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

<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.

+0

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

+0

Yea , поэтому редактирование предлагает способ расширить базовый тип поля для соответствия различным специализациям, но я не совсем уверен, насколько он точен/действителен. – chrisbunney

5

Значение по умолчанию для 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> 

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

+0

Выглядит хорошо и актуально. Я бы сказал, что, хотя такая общая схема действительна, она не сильно отличается от формального определения XML-файла экземпляра.Однако, вероятно, это самый простой способ создать допустимую схему (+1) – chrisbunney