XML-схема для рекурсивных пар ключ-значение - PullRequest
0 голосов
/ 24 февраля 2019

Рассмотрим следующий пример XML-документа, который содержит переменные с парами ключ-значение, которые также могут быть рекурсивными:

<?xml version="1.0" encoding="UTF-8"?>
<environments>
    <variable>
        <key>Variable 1</key>
        <value>Value</value>
    </variable>

    <variable>
        <value>B</value>
        <key>Variable 2</key>
    </variable>

    <variable>
        <value></value>
        <key>Variable 2</key>
    </variable>

    <variable>
        <key>Variable 2</key>
        <value>
            <variable>
                <key>Foo</key>
                <value>Bar</value>
            </variable>
        </value>
    </variable>

    <variable>
        <key>Variable 2</key>
        <value>
            <variable>
                <key>Foo</key>
                <value>
                    <variable>
                        <key>Foo</key>
                        <value>Bar</value>
                    </variable>
                </value>
            </variable>
        </value>
    </variable>
</environments>

Я хотел бы создать схему XML, которая может проверить эту структуру: ноль или болееvariable элементы, key элементы являются только строковыми, а value элементы являются только строковыми или вложенными переменными.

До сих пор я придумал следующее:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">

  <!-- Element: Environments -->
  <xs:element name="environments">
    <xs:complexType>
      <xs:sequence maxOccurs="unbounded">
        <xs:element ref="variable"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <!-- Element: variable_type -->   
  <xs:element name="variable">
    <xs:complexType>

        <xs:all>
          <xs:element ref="key"/>
          <xs:element ref="value"/>
        </xs:all>

    </xs:complexType>
  </xs:element>

  <!-- Element: key -->
  <xs:element name="key" type="xs:string"/>

  <!-- Element: value -->
  <xs:element name="value">
    <xs:complexType mixed="true">
      <xs:sequence>
        <xs:choice>
          <xs:element minOccurs="0" maxOccurs="unbounded" ref="variable"/>
        </xs:choice>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

Эта схема работаетдля моего образца документа.Тем не менее, я очень не уверен, когда дело доходит до элемента значения: <xs:complexType mixed="true">.Это будет означать, что такой элемент variable также будет считаться допустимым (дополнительные foo символов перед вложенным элементом variable):

    <variable>
        <key>Variable 2</key>
        <value>
            foo
            <variable>
                <key>Foo</key>
                <value>Bar</value>
            </variable>
        </value>
    </variable>

Мой вопрос: как я могу быть уверенчто элемент value является либо другим элементом variable (сложный тип), либо просто строкой?

1 Ответ

0 голосов
/ 24 февраля 2019

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

...