使用 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
的数据。
所以我发现 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
的数据。