使用 XML 架构来扩展具有属性而不是复杂类型的元素

Use XML Schema to extend an element with attributes rather than a complexType

所以我发现 post 这与我想要实现的目标非常相似,但我不太清楚是否无法实现我正在尝试的目标,或者我是否只是遗漏了一些东西...

Use XML Schema to extend an element rather than a complexType

要点是我有一个包含已定义元素的 XSD。我不想编辑这个原始 xsd 文件。我有什么办法可以扩展元素,以便我也可以添加自己的属性,"attributeC"?

另一个 post 创建一个新的 fooType 复杂类型,并将元素放入其中,并扩展 fooType 以包含更多元素。通过这样做,他们能够获得一个包含 fooElement 和另外两个添加元素的 Element。问题是我想添加到元素本身,而不是添加到同一级别的元素。

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

此代码最终会生成一个新的 FileSpec

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

我想要实现的更像是...

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

任何人都可以指出正确的方向来解决我的问题吗?

我想我可以定义自己的 dataType=FileSpec 并添加自己对外部属性的引用,但这需要手动复制原始 XSD2 FileSpec 中存在的每个属性,所以我如果可能的话,我宁愿避免这种情况。然后我想我可以使用我创建的新 FileSpec 并用它重新定义旧的 FileSpec。这可能吗?听起来很多工作必须有一个更简单的解决方案。

有点不清楚您要做什么,如果这没有涵盖它,请 post 您要包含的架构以及 XML 您要生成的架构,包括包含元素.

您可以像这样扩展现有的 xs:complexType

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

当使用 BaseType 有效时,还有另一种方法可以使用 ExtendedType

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

注意 BaseElm 中的 xsi:type="ExtendedType",这告诉 XML 处理器该元素实际上包含 ExtendedType 的数据。