使用 XML Schema 来扩展具有属性而不是 complexType 的元素

Posted

技术标签:

【中文标题】使用 XML Schema 来扩展具有属性而不是 complexType 的元素【英文标题】:Use XML Schema to extend an element with attributes rather than a complexType 【发布时间】:2020-06-19 17:53:47 【问题描述】:

所以我发现这篇文章与我想要实现的目标非常相似,但我无法完全确定是否无法做到我正在尝试的事情,或者我只是错过了一些东西......

Use XML Schema to extend an element rather than a complexType

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

另一篇文章创建了 fooType 的新 complexType,并将元素放入其中,并扩展 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。这可能吗?听起来很多工作必须有一个更简单的解决方案。

【问题讨论】:

【参考方案1】:

有点不清楚您要做什么,如果这没有涵盖它,请发布您包含的架构以及您尝试生成的 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 的数据。

【讨论】:

不幸的是,根据您给我的详细信息,如果不编辑我拥有的基本 XSD,我想要实现的目标是不可能的。看来我真的受到了我想要编辑的东西只是元素而不是复杂类型的限制。您的回答确实澄清了一些事情,也让我知道如果它是一个 complexType 我将如何实现它,所以我非常感谢您的帮助。谢谢。

以上是关于使用 XML Schema 来扩展具有属性而不是 complexType 的元素的主要内容,如果未能解决你的问题,请参考以下文章

xml

XML 扩展部分

XML之schema

XML Schema:具有仅包含文本的属性的元素?

Schema约束

XML和Schema命名空间详解