Используйте XML Schema для расширения элемента с атрибутами, а не complexType - PullRequest
0 голосов
/ 07 марта 2020

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

Использование XML Схема для расширения элемента, а не complexType

Суть в том, что у меня есть XSD, который содержит определенный Элемент. Я бы предпочел не редактировать этот оригинальный файл xsd. Можно ли как-нибудь расширить Элемент, чтобы я также мог добавить свои собственные атрибуты "attribute C"?

Другой пост создает новый complexType для fooType, помещает элемент в него и расширяет fooType, чтобы содержать больше элементов. Тем самым они могут получить Элемент, содержащий fooElement и два других добавленных элемента. Проблема в том, что я хотел бы добавить сам элемент, а не добавить элемент на том же уровне.

XSD1

<xs:schema xmlns:bas="http://www.base.com"
           xmlns="https://www.adding.com"
           attributeFormDefault="qualified"
           elementFormDefault="qualified"
           targetNamespace="https://www.adding.com"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import schemaLocation="XSD2.xsd" namespace="http://www.base.com" />
  <xs:complexType name="FileSpecType">
        <xs:sequence>
            <xs:element ref="bas:FileSpec"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="FullFileSpecType">
        <xs:complexContent mixed="false">
            <xs:extension base="FileSpecType">
                <xs:attribute name="attributeC" type="xs:string" />
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:element name="FileSpec" type="FileSpecType" />

Этот код заканчивается создание нового FileSpe c

<FileSpec AttributeC="attCval" />>
    <bas:FileSpec/>
</FileSpec>

Чего я хочу достичь, это больше похоже на ...

<bas:FileSpec AttributeA="attAval" AttributeB="attBval" AttributeC="attCval/>

Кто-нибудь может указать мне правильное направление для решения моих проблем?

Я думаю, что мог бы определить свой собственный dataType = FileSpe c и добавить свою собственную ссылку на внешние атрибуты, но для этого потребовалось бы вручную копировать каждый атрибут, который существует в моем исходном XSD2 FileSpe c поэтому я предпочел бы избежать этого, если это возможно. Тогда я думаю, что смогу взять созданный мной новый FileSpe c и переопределить старый FileSpe c. Возможно ли это сделать? Похоже, много работы, которая должна иметь более простое решение.

1 Ответ

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

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

Вы можете расширить существующий xs:complexType следующим образом.

Extending a complexType with Liquid XML Studio

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid Studio 2020 (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="BaseType">
        <xs:attribute name="attributeA" type="xs:string" />
    </xs:complexType>
    <xs:complexType name="ExtendedType">
        <xs:complexContent>
            <xs:extension base="BaseType">
                <xs:attribute name="attributeB" />
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:element name="RootElm">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="BaseElm" type="BaseType" />
                <xs:element name="ExtendedElm" type="ExtendedType" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Это позволяет вам создать XML, который выглядит следующим образом

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Studio 2020 (https://www.liquid-technologies.com) -->
<RootElm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <BaseElm attributeA="XX" />
    <ExtendedElm attributeA="YY" attributeB="ZZ" />
</RootElm>

Существует еще один способ использовать ExtendedType, когда он действителен для использования BaseType

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Studio 2020 (https://www.liquid-technologies.com) -->
<RootElm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <BaseElm xsi:type="ExtendedType" attributeB="XX" attributeA="YY" />
    <ExtendedElm attributeA="XX" attributeB="YY" />
</RootElm>

Обратите внимание на xsi:type="ExtendedType" в BaseElm, это говорит XML процессор, который этот элемент на самом деле содержит данные для ExtendedType.

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