Работа с несколькими XSD - PullRequest
       11

Работа с несколькими XSD

1 голос
/ 23 октября 2009

У меня есть xsd, который имеет 3 импорта в другой xsd, 8 сложных типов и 3 простых типа.

Теперь мне нужно поработать только с одним типом типа «комбекс», который, в свою очередь, наследует многие другие XSD - в основном те 3 импорта, которые имеет текущий xsd.

Я получу XML-файл, содержащий данные только по одному сложному типу, о котором я упоминал.

Сейчас я пытаюсь сгенерировать образец XML-файла, который содержит данные в соответствии с одним сложным типом, и пытаюсь проверить его, но когда я пытаюсь сделать это с помощью XMLSpy или OxygenXML, он говорит, что корневой узел не определен.

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

Также еще один мой вопрос: можем ли мы проверить XML-файл по какой-то части XSD по сравнению с полным XSD, потому что XML, который я получаю, соответствует 1 сложному типу элемента в XSD?

Формат исходного XSD:

 <?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:schema location targetNamespace=targetnamespace elementFormDefault="qualified" attributeFormDefault="unqualified" version="0.652">
    <xs:import namespace=first xsd which is imported>
    <xs:import namespace=second xsd which is imported>
    <xs:import namespace=third xsd which is imported>
    <xs:complexType name="firstcomplextype" abstract="false">
        <xs:sequence>
            <xs:element name="some value" type="xs:string" minOccurs="0"/>
            <xs:element name="some value" type="some value"/>
            <xs:element name="some value" type="xs:string" minOccurs="0"/>
        </xs:sequence>
        <xs:attribute name="some value" type="xs:int" use="required"/>
        <xs:attribute name="some value" type="xs:value" use="required"/>
        <xs:attribute name="some value" type="xs:int" use="required"/>
    </xs:complexType>
    <xs:complexType name="second complex type" abstract="false">
        <xs:sequence>
            <xs:element name="some value" type="xs:some value" minOccurs="0"/>
            <xs:element name="some value" type="xs:some value" minOccurs="0"/>
            <xs:element name="some value" type="some value"/>
            <xs:element name="some value" type="some value"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="third complex type**I need to work with only this complex type and xml file will contain data according to this complex type only and I need to validate incoming XML against only this complex type**" abstract="false">
        <xs:sequence>
            <xs:element name="some value" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="some value" type="some value" minOccurs="0" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="some value" type="some value"/>
            <xs:element name="some value" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="some value" type="some value" minOccurs="0" maxOccurs="unbounded"/>---**Here this particular element points to another XSD, one of the imported XSD's**
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:sequence minOccurs="0">
                <xs:element name="some value" type="xs:some value" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element name="some value" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="some value" type="some value" minOccurs="0" maxOccurs="unbounded"/>---**Here this particular element points to another XSD, one of the imported XSD's**
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:sequence minOccurs="0">
                <xs:element name="some value" type="xs:some value" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element name="some value" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="some value" type="some value" minOccurs="0" maxOccurs="unbounded"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="4th complex type" abstract="false">
        <xs:sequence>
            <xs:element name="elements">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="some value" type="some value" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

и xsd продолжается, так как имеет много более сложных типов и простых типов. Любое руководство будет высоко ценится.

Ответы [ 2 ]

1 голос
/ 24 октября 2009

Файл схемы, который вы разместили, показывает только complexType определений. Чтобы проверить документ XML, вы должны иметь объявление element на верхнем уровне, которое соответствует корневому элементу документа. Если ваша схема (или одна из импортированных схем) имеет такую, пожалуйста, опубликуйте эту часть, а также короткий XML-документ, который вы пытаетесь проверить.

Нет проблем с проверкой по "части" схемы. Любое объявление element на верхнем уровне может служить корневым элементом проверенного XML-документа, поскольку XML-схема не имеет понятия определения корневого элемента (в отличие от DTD и RELAX NG, которые более ориентированы на документы).

Если у вас есть контроль над вашими XML-документами, вы также можете попробовать присоединить атрибут xsi:type к корневому элементу, чтобы указать complexType, с которым вы хотите проверить. Таким образом, вы бы добавили что-то вроде

xsi:type="firstcomplextype" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

в атрибутах корневого элемента вашего XML-документа.

0 голосов
/ 26 октября 2009

Вам необходимо добавить в вашу схему элемент, имеющий тип сложного типа, с которым вы хотите работать. Объявление элемента выглядит так:

Код: Выбрать все

   <xs:element name="newElement" type="thirdComplexType"/>

Вы можете объявить свой элемент непосредственно в текущей схеме (той, что вы даете нам в качестве примера), или вы можете создать новую схему, которая импортирует текущую и объявит элемент там.

Сгенерированный XML-файл будет проверен на соответствие сложному типу "thirdComplexType", поскольку в качестве корневого элемента он будет иметь "newElement" Другими словами, файл XML автоматически проверяется на соответствие некоторой части XSD.

Подробнее о схеме XML вы можете прочитать здесь:

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