Схема XML для класса, содержащего DataTable - PullRequest
1 голос
/ 24 апреля 2009

У меня есть один класс, который имеет поле типа DataTable.

Я хочу написать XSD для этого класса. Моя проблема в том, что структура данных не исправлена. Столбцы добавляются динамически. Как написать XSD для такого класса?

Как только XSD определен, я хочу проверить класс, сериализованный в XML, против XSD.

Ответы [ 3 ]

1 голос
/ 24 апреля 2009

Звучит так, будто вам нужен мета-формат, в котором схема определяет способ определения столбцов вместо определения отдельных столбцов.

Этот тип xml имеет тенденцию быть уродливым и многословным (например, рассмотрим xmlrpc и мыло). Это также означает, что схема не может проверять фактические столбцы, и только то, что они были определены правильно.

XML будет выглядеть примерно так:

<DataTable>
  <column name="..." value="..."/>
  <column name="..." value="..."/>
</DataTable>

XSD будет выглядеть примерно так:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="DataTable">
    <xs:complexType>
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element name="column">
          <xs:complexType>
            <xs:attribute name="name" type="xs:string"/>
            <xs:attribute name="value" type="xs:string"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Конечно, если вам нужны структурированные значения (а не только строки), вам понадобится нечто более сложное. Если вам нужны произвольные объекты, они могут быть представлены в виде карты для каждого объекта со значениями, которые могут быть отображены по очереди и т. Д. Определение схемы элемента должно быть рекурсивным, поэтому оно может содержать другой экземпляр самого себя. Это в основном то, что делают xmlrpc и мыло.

РЕДАКТИРОВАТЬ Это не соответствует вашим "столбцам", но пример:

<object name="contact">
  <object name="home">
    <object name="tel">
       <string name="area" value="910"/>
       <string name="num" value="1234 5678"/>
    </object>
  </object>
  <object name="work">
    <object name="tel">
       <string name="area" value="701"/>
       <string name="num" value="8888 8888"/>
    </object>
    <object name="fax">
       <string name="area" value="701"/>
       <string name="num" value="9999 9999"/>
    </object>
  </object>
</object>

Основная идея грамматики:

V --> string | O      // a Value is a string or an Object
O --> (K V)*          // an Object is list of named values (Key-Value pairs)

Изменено, поэтому корень всегда является объектом и называется:

O ==> (string K | O)* K

XSD для этого:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="object">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">

        <xs:element name="string">
          <xs:complexType>
            <xs:attribute name="name" type="xs:string"/>
            <xs:attribute name="value" type="xs:string"/>
          </xs:complexType>
        </xs:element>

        <xs:element ref="object"/>

      </xs:choice>
      <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
  </xs:element>

</xs:schema>
1 голос
/ 24 апреля 2009

Если вы проверяете сериализованный xml на XSD, это означает, что он должен соответствовать какой-то структуре, но он может быть очень гибким. Вам нужно научиться создавать XSD и различные атрибуты и параметры. Какую бы структуру вы ни захотели, начните определять ее, как только вы начнете процесс, это будет не так сложно. После задайте конкретный проблемный вопрос и SO сообщество поможет.

Базовое руководство по XSD http://www.w3schools.com/Schema/ Вы можете ликвидировать xml studio для создания XSD. Это бесплатно и на основе графического интерфейса http://www.liquid -technologies.com /

0 голосов
/ 24 апреля 2009

Вообще говоря, если столбцы являются динамическими, XSD также должен быть динамическим. Одним из решений может быть реализация дополняющей функции для той, которая создает столбцы таблицы, функции, которая динамически создает инструкцию xls для соответствующего элемента xls (который представляет таблицу классов). Конечно, нужно заранее определить статические части xsd и объединить их с динамически созданными частями xsd.

Для работы с XML я предлагаю вам Stylus Studio.

...