Создание XSD-схемы

У меня есть тег xml:

<ROW field1="value 1"  field2="value 2" ...  />

fieldi имеет строковое значение, а количество атрибутов fieldi является переменным, но не менее 1. Можно ли создать схему xsd для этого тега?

возможный xml-документ

<ROWDATA>
  <ROW field1="dfgdf" field2="ddfg"></ROW>
  <ROW field1="dfedf" field2="djkfg" field3="cdffd"></ROW>
  <ROW field1="dfedf" field2="djkfg" field3="cdffd" field4="dfedf" field5="djkfg" field6="cdffd"></ROW>
</ROWDATA> 

в этом xml-документе, который я получаю с веб-сервера, может быть переменное количество полей атрибутов (я отметил их как fieldi, где я имею в виду порядок определенного поля атрибута). Итак, у меня есть неизвестное количество элементов ROW и неизвестно количество атрибутов поля в элементе ROW

Спасибо


person Nikolai    schedule 10.03.2010    source источник


Ответы (4)


Если вы используете Visual Studio 2008:

  • Откройте файл Xml в Visual Studio.
  • Перейдите к пункту меню «Xml» в верхней части экрана.
  • Выберите «Создать схему»

Это сгенерирует ваши схемы xsd

ИЗМЕНИТЬ Попробуйте этот пример для получения подробной информации о настройке minOccurs (на элементы) или обязательные (для атрибутов), чтобы вы могли манипулировать своей производной схемой.

person amelvin    schedule 10.03.2010
comment
Я пытался, но получил схему с необязательными атрибутами, это не то, что мне нужно, потому что я не знаю, сколько у меня атрибутов - person Nikolai; 10.03.2010
comment
@ Николай - я расширил свой ответ. - person amelvin; 10.03.2010

Если вам неудобно писать XSD самостоятельно, используйте какой-нибудь генератор, например это.

EDIT: Основываясь на вашем XML в комментариях, я могу представить структуру XSD ниже.

<xsd:element name="FieldHeader">
     <xsd:complexType>
          <xsd:sequence>
               <xsd:element name="Fields" type="xsd:string"/> <!--use minOccurs  maxOccurs here-->
          </xsd:sequence>
     </xsd:complexType>
 </xsd:element>
<xsd:simpleType name="fieldi">  
    <xsd:restriction base="xsd:string"/>
</xsd:simpleType>
<xsd:simpleType name="Fields"> 
    <xsd:list itemType="fieldi" />
</xsd:simpleType>
person Ravi Gupta    schedule 10.03.2010
comment
Я пытался использовать некоторые генераторы, но они генерировали атрибуты с необязательным флагом. В моем случае я не знаю, сколько атрибутов fieldi может быть в теге ‹ROW... /› - person Nikolai; 10.03.2010
comment
Если вы не знаете, сколько раз элемент будет появляться в XML, вы можете установить для атрибута maxOccurs элемента fieldi значение unbounded, что означает, что может быть столько вхождений элемента fieldi, сколько пожелает автор. - person Ravi Gupta; 10.03.2010
comment
нет возможности установить maxOccurs для атрибутов, это можно сделать только для элементов - person Nikolai; 10.03.2010
comment
Хорошо, давайте проясним это. Добавьте образец XML в свой вопрос, и мы разработаем для него XSD. - person Ravi Gupta; 10.03.2010
comment
пример: ‹ROWDATA› ‹СТРОКА field1=dfgdf field2=ddfg› ‹/ROW› ‹ROW field1=dfedf field2=djkfg field3=cdffd› ‹/ROW› ‹ROW field1=dfedf field2=djkfg field3=cdffd field4=dfedf field5= djkfg field6=cdffd› ‹/ROW› ‹/ROWDATA› - person Nikolai; 10.03.2010
comment
@Nikolai, не могли бы вы отредактировать свой исходный вопрос с примером XML и любыми примечаниями о структуре, которые вы можете придумать. Спасибо. - person amelvin; 10.03.2010

Кажется, я понял ваше требование. Чтобы избежать недоразумений, позвольте мне раскрыть то, что я однажды понял:
"У вас есть файл xml, который содержит элемент с именем fieldi, поставляется с набором каких-то неизвестных атрибутов. Значит, вы не знаете [или говорите не хочу] имена и значения этих атрибутов. Просто хочу увидеть, что появляется как минимум 1 атрибут",

Хорошо. извините, это требование исчерпало возможности XML-схемы. :-[

У вас не может быть атрибутов, не объявленных в схеме. Если он появляется в xml, для этого требуется правильное определение. Существует что-то под названием <anyAttribute/> [нажмите-здесь], которое снова требует определения [где-то, в другая связанная схема].

1) Определение всех возможных атрибутов, составляющих use="optional", не представляется практически возможным. А также пропустить ваше последнее требование.
2) Если это возможно, то преобразовать все атрибуты в элементы [используя преобразование, или вы можете либо попросить отправителя сделать это, я не знаю, насколько это сложно в ваш случай] И определите элемент <any/>, что звучит несколько удобно. но ваше требование [должен появиться хотя бы один атрибут] все еще не выполнено.

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

с уважением,
infant-pro

person InfantPro'Aravind'    schedule 11.03.2010
comment
Привет, теперь есть возможность изменять атрибуты элементов, потому что это не мой xml, я получаю его с сервера... в любом случае спасибо - person Nikolai; 12.03.2010

Я решил проблему, но другим способом, управляя десериализацией xml-документа так, как мне нужно. Однако мне это решение не нравится, потому что я хотел создать классы из схемы xsd и использовать их в своем коде.

В любом случае спасибо всем

person Nikolai    schedule 12.03.2010