0

因此,我发现这篇文章与我想要实现的目标非常相似,但我不太清楚是否不可能做我正在尝试的事情,或者我是否只是错过了一些东西......

使用 XML Schema 来扩展元素而不是 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。这可能吗?听起来很多工作必须有一个更简单的解决方案。

4

1 回答 1

1

它有点不清楚您要做什么,如果这不包括它,请发布您包含的架构以及您尝试生成的 XML,包括包含的元素。

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

使用 Liquid XML Studio 扩展 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>

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

于 2020-03-07T15:26:54.453 回答