Как импортировать XSD и добавить расширение в элемент - PullRequest
0 голосов
/ 06 марта 2020

РЕДАКТИРОВАТЬ: Основываясь на моем чтении, я думаю, что мне нужно попробовать что-то вроде этого ... Как расширить сложный тип в другом пространстве имен без изменения имени Я еще не попробовал, но обновлю, если я добиться успеха с этим методом ...

Итак, у меня есть проект, в котором у меня есть массивный XSD, предоставленный третьей стороной, и я хотел бы добавить свои собственные элементы и атрибуты в XSD. Я хотел бы добавить элемент в substitutiongroup = "SpecificResource", а также атрибут.

Давайте назовем более крупный сторонний xsd "base.xsd", я сократил его до частей, которые я считаю имеют отношение к примеру.

<xs:schema targetNamespace="http://www.base.com"
           xmlns="http://www.base.com"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified">

  <xs:element abstract="true" name="SpecificResource" type="SpecificResource"/>
  <xs:complexType abstract="true" name="SpecificResource">
      <xs:anyAttribute namespace="##other" processContents="lax"/>
  </xs:complexType>

 <xs:element name="FileSpec">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="1" minOccurs="0" ref="Disposition"/>
                <xs:element maxOccurs="unbounded" minOccurs="0" ref="NetworkHeader"/>
            </xs:sequence>
            <xs:attribute name="Example" type="xs:string" use="optional"/>
            <xs:anyAttribute namespace="##other" processContents="lax"/>
        </xs:complexType>
    </xs:element>

И мой пользовательский xsd с именем "Custom.xsd"

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:cus="https://www.custom.com"
           xmlns="http://www.base.com"
           targetNamespace="https://www.custom.com"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified">
    <xs:import namespace="https://www.base.com" schemaLocation="base.xsd"/>

    <xs:attribute name="URL" type="xs:string"/>
    <xs:attribute name="customattribute" type="xs:NMTOKEN"/>

    <xs:element name="SpecRes1" substitutionGroup="SpecificResource" type="cus:SpecRes1"/>

    <xs:complexType name="SpecRes1">
        <xs:complexContent>
            <xs:extension base="SpecificResource">
                <xs:attribute ref="cus:customattribute"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name ="fullfilespec">
        <xs:complexContent>
            <xs:extension base="FileSpec">
                <xs:attribute ref="URL" use="optional"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

Однако, сейчас я получаю "Undefined complexType 'http://www.base.com : FileSpe c 'используется в качестве основы для расширения сложного типа. " Я не понимаю, почему, как мне кажется, Filespe c определен в файле base.xsd.

Я что-то не так делаю, когда дело доходит до импорта?

Последующий вопрос: есть ли способ заставить Imported XSD не требовать префиксов, в то время как добавление элементов, которые я добавил, требует префикса пространства имен (cus :) В настоящее время я смог добавить свой элемент в «SpecificResource», но мой элемент, кажется, определен в Пространство имен base.xsd, которое я не думаю, то, что я хочу. Когда я использую XSD, я получаю файл, который действителен без добавления префиксов в добавленные элементы, что затрудняет различие между тем, что я добавил, и тем, что уже существовало. (Я генерирую файл класса из xsd, а также сериализую и десериализирую данные с его помощью.)

Я использовал этот подход для импорта базового xsd, чтобы мне не нужно было трогать файл base.xsd, но разве невозможно расширить импортированные элементы в вашем пользовательском пространстве имен?

Я изначально добавлял в base.xsd и импортировал свой custom.xsd, но становится очень утомительно продолжать добавлять в base.xsd, хотя затрудняет добавление в группу замещения SpecificResource.

1 Ответ

1 голос
/ 07 марта 2020

Вы не можете продлить xs:element, вы можете продлить только xs:complexType. И вы можете ссылаться на атрибут, который определен в элементе xs:schema (т.е. атрибут root), но вы должны квалифицировать его, используя его целевое пространство имен. Также пространство имен в xs:import должно соответствовать исходному xsd-файлу (ваш http: https отсутствует).

enter image description here

enter image description here

Base.xsd

<?xml version="1.0" encoding="utf-8" ?>
<!-- Created with Liquid Studio 2020 (https://www.liquid-technologies.com) -->
<xs:schema xmlns="http://www.base.com" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.base.com" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="SpecificResource" type="SpecificResource" abstract="true" />
    <xs:complexType abstract="true" name="SpecificResource">
        <xs:anyAttribute namespace="##other" processContents="lax" />
    </xs:complexType>
    <xs:complexType name="FileSpec">
        <xs:sequence>
            <xs:element name="Disposition" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="NetworkHeader" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="Example" type="xs:string" use="optional" />
        <xs:anyAttribute namespace="##other" processContents="lax" />
    </xs:complexType>
</xs:schema>

Main.xsd

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid Studio 2020 (https://www.liquid-technologies.com)-->
<xs:schema xmlns:cus="https://www.custom.com" xmlns="http://www.base.com" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="https://www.custom.com" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:import schemaLocation=".\base.xsd" namespace="http://www.base.com" />
    <xs:attribute name="URL" type="xs:string" />
    <xs:attribute name="customattribute" type="xs:NMTOKEN" />
    <xs:element name="SpecRes1" type="cus:SpecRes1" substitutionGroup="SpecificResource" />
    <xs:complexType name="SpecRes1">
        <xs:complexContent>
            <xs:extension base="SpecificResource">
                <xs:attribute ref="cus:customattribute" />
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="fullfilespec">
        <xs:complexContent>
            <xs:extension base="FileSpec">
                <xs:attribute ref="cus:URL" use="optional" />
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:schema>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...