Элементы XSD внутри рекурсивного определенного элемента - PullRequest
0 голосов
/ 18 сентября 2018

У меня проблема с XML Schema.Я хотел бы ввести elements в другой element, который был определен как рекурсивный.

Вышеприведенные строки кода предназначены для представления файлов и папок.

Вот текущийкод:

<?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"> 

    <xs:complexType name="folder_type">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="folder" type="folder_type"></xs:element>
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" use="required"></xs:attribute>
    </xs:complexType>

    <xs:element name="filefoldertree">
        <xs:complexType>
            <xs:sequence minOccurs="0" maxOccurs="unbounded">
                <xs:element name="folder" type="folder_type"></xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Например, приведенный выше код XSD позволяет мне определить следующие XML строки:

<filefoldertree xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="file:/C:/Users/Hadi/Desktop/filefoldertree.xsd">

    <folder name="a">
        <folder name="b">
            <folder name="c">
            </folder>
        </folder>
    </folder>
    <folder name="d">
    </folder>
</filefoldertree>

До тех пор, пока это не будет желательным поведением.Однако я хотел бы добавить последовательность file elements, вложенную в последовательность folder.Например, я ищу следующий результат:

    <folder name="a">
        <folder name="b">
            <file attr1="x" attr2="y" attr3="z"></file>
            <folder name="c">
                <file attr1="x" attr2="y" attr3="z"></file>
            </folder>
        </folder>
    </folder>
    <folder name="d">
        <file attr1="x" attr2="y" attr3="z"></file>
    </folder>
    <file attr1="x" attr2="y" attr3="z"></file> 

Поскольку folder является typed element, я не могу определить вложенный complextype, однако мне нужна его рекурсивная функциональность.

Как изменить код XSD, чтобы добиться поведения, показанного приведенным выше кодом?

Спасибо за ваши ответы.

1 Ответ

0 голосов
/ 18 сентября 2018

Вы можете использовать xs:choice в объявлении рекурсивного типа следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified">

  <xs:element name="filefoldertree" type="FolderType"/>

  <xs:complexType name="FolderType">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="folder" type="FolderType"/>
      <xs:element name="file" type="FileType"/>
    </xs:choice>
    <xs:attribute name="name" type="xs:string" use="required"/>
  </xs:complexType>

  <xs:complexType name="FileType">
    <xs:sequence/>
    <xs:attribute name="name" type="xs:string" use="required"/>
  </xs:complexType>

</xs:schema>

Примечание. Возможно, вы захотите назвать элемент верхнего уровня folder, а не одноразовый, filefoldertree.

...