Можно ли выразить эту структуру XML с помощью XSD? Другие варианты проверки? - PullRequest
0 голосов
/ 15 марта 2011

У меня есть следующая структура документа XML, которая уже находится в производстве и не может быть изменена:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<root xmlns="http://www.domain_name.com/MySchema">
    <optionalString1>a</optionalString1>
    <optionalString2>b</optionalString2>
    <optionalDependee1>c</optionalDependee1>
    <dependent1_1>d</dependent1_1>
    <dependent1_2>e</dependent1_2>
    <optionalString3>f</optionalString3>
    <optionalDependee2>g</optionalDependee2>
    <dependent2_1>h</dependent2_1>
    <dependent2_2>i</dependent2_2>
    <!-- more and more elements -->
</root>

Вот ограничения, которые я пытаюсь выразить в XSD:

  1. Элементы XML могут появляться в любом порядке.
  2. «AdditionalStringX» и «AdditionalDependeeX» могут присутствовать или отсутствовать в данном файле.
  3. Если присутствует параметр «AdditionalDependeeX», то ТРЕБУЕТСЯ, чтобы «зависимый Х_1» и «зависимый Х_2» присутствовали. В противном случае, если «AdditionalDependeeX» не присутствует, не будет присутствовать ни «independentX_1», ни «independentX_2».

Я пробовал несколько вариаций с использованием 'complexType' и 'group', но они не являются действительными XSD (по крайней мере, в соответствии с VS2010). Моя «групповая» реализация выглядит так:

<xs:schema>

<xs:group name="BaseGroup">
  <xs:all>
    <xs:element name="optionalString1" type="xs:string" minOccurs="0" />
    <xs:element name="optionalString2" type="xs:string" minOccurs="0" />
    <xs:element name="optionalString3" type="xs:string" minOccurs="0" />
  </xs:all>
</xs:group>

<xs:group name="DependentGroup1">
  <xs:all>
    <xs:element name="optionalDependee1" type="xs:string" minOccurs="1" />
    <xs:element name="dependent1_1" type="xs:string" minOccurs="1" />
    <xs:element name="dependent1_2" type="xs:string" minOccurs="1" />
  </xs:all>
</xs:group>

<xs:group name="DependentGroup2">
  <xs:all>
    <xs:element name="optionalDependee2" type="xs:string" minOccurs="1" />
    <xs:element name="dependent2_1" type="xs:string" minOccurs="1" />
    <xs:element name="dependent2_2" type="xs:string" minOccurs="1" />
  </xs:all>
</xs:group>

<xs:group name="Combo1">
  <xs:all>
    <!-- The 'http://www.w3.org/2001/XMLSchema:group'
         element is not supported in this context. -->
    <xs:group ref="BaseGroup"/>
    <xs:group ref="DependentGroup1"/>
  </xs:all>
</xs:group>

<xs:group name="Combo2">
  <xs:all>
    <!-- The 'http://www.w3.org/2001/XMLSchema:group'
         element is not supported in this context. -->
    <xs:group ref="BaseGroup"/>
    <xs:group ref="DependentGroup1"/>
    <xs:group ref="DependentGroup2"/>
  </xs:all>
</xs:group>

<xs:complexType name="RootType">
  <xs:choice minOccurs="1" maxOccurs="1">
    <xs:group ref="BaseGroup" />
    <xs:group ref="Combo1" />
    <xs:group ref="Combo2" />
  </xs:choice>
</xs:complexType>

<xs:element name="root" type="RootType" />

</xs:schema>

Я новичок в схемах проверки XML и до сих пор всегда предполагал, что XSD достаточно гибок, чтобы представлять структуру всего допустимого XML. Если бы я мог переписать структуру файлов XML, я бы сделал зависимые X_1 и зависимые X_2 либо атрибутами, либо подэлементами необязательного элемента DedededeX, поскольку они выражали бы зависимые отношения.

  1. Могут ли эти ограничения быть представлены в схеме XSD? Мы стараемся придерживаться XSD, если это возможно, поскольку, насколько я понимаю, инструменты и поддержка для него гораздо более распространены, чем другие решения для проверки.
  2. Если нет, то какой другой валидатор XML имеет хорошую поддержку в Python, Perl и C или C ++ и может обрабатывать более сложные структуры документов, чем XSD? Подойдет ли RelaxNG или Schematron? Плюсы и минусы? Я никогда не использовал ничего кроме XSD.

Ответы [ 2 ]

1 голос
/ 16 марта 2011

до сих пор всегда предполагал, что XSD достаточно гибок, чтобы представлять структуру всех допустимых XML

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

1 голос
/ 15 марта 2011

Как вы правильно сделали, порядок можно ослабить с помощью xsd: все, кроме того, что вы пытаетесь сделать, не поддерживается. следующая версия XML Schema , то есть 1.1, может поддерживать некоторые другие варианты, которые у вас есть.Но 1.1 не является окончательным, и нет многих библиотек, которые понимают это.Я бы посоветовал вам взглянуть на schematron и посмотреть, может ли это помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...