如何导入 XSD 并向元素添加扩展

How to Import XSD and add extension to Element

编辑:根据我的阅读,我认为我需要尝试这样的事情……How to extend a complex type in a different namespace without changing name我还没有尝试过,但如果我用这种方法成功了,我会更新……

所以我有一个项目,其中有一个由第三方提供的大量 XSD,我想将自己的元素和属性添加到 XSD。我想将一个元素添加到 substitutiongroup="SpecificResource" 以及一个属性。

让我们调用较大的第三方 xsd "base.xsd",我已将其简化为我认为与示例相关的部分。

<xs:schema targetNamespace="http://www.base.com"
           xmlns="http://www.base.com"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified">

  <xs:element abstract="true" name="SpecificResource" type="SpecificResource"/>
  <xs:complexType abstract="true" name="SpecificResource">
      <xs:anyAttribute namespace="##other" processContents="lax"/>
  </xs:complexType>

 <xs:element name="FileSpec">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="1" minOccurs="0" ref="Disposition"/>
                <xs:element maxOccurs="unbounded" minOccurs="0" ref="NetworkHeader"/>
            </xs:sequence>
            <xs:attribute name="Example" type="xs:string" use="optional"/>
            <xs:anyAttribute namespace="##other" processContents="lax"/>
        </xs:complexType>
    </xs:element>

我的自定义 xsd 名为 "Custom.xsd"

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:cus="https://www.custom.com"
           xmlns="http://www.base.com"
           targetNamespace="https://www.custom.com"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified">
    <xs:import namespace="https://www.base.com" schemaLocation="base.xsd"/>

    <xs:attribute name="URL" type="xs:string"/>
    <xs:attribute name="customattribute" type="xs:NMTOKEN"/>

    <xs:element name="SpecRes1" substitutionGroup="SpecificResource" type="cus:SpecRes1"/>

    <xs:complexType name="SpecRes1">
        <xs:complexContent>
            <xs:extension base="SpecificResource">
                <xs:attribute ref="cus:customattribute"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name ="fullfilespec">
        <xs:complexContent>
            <xs:extension base="FileSpec">
                <xs:attribute ref="URL" use="optional"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

但是,现在我得到 "Undefined complexType 'http://www.base.com:FileSpec' is used as a base for complex type extension." 我不明白为什么我认为 Filespec 是在 base.xsd 中定义的。

我是不是在导入时做错了什么?

后续问题是是否有办法使导入的 XSD 不需要前缀,同时使我添加的项目需要名称空间前缀 (cus:) 目前我已经能够添加我的"SpecificResource" 的元素,但我的元素似乎是在 base.xsd 命名空间中定义的,我认为这不是我想要的。当我使用 XSD 时,我最终得到一个有效的文件,但没有在我添加的元素上放置前缀,这使得很难区分我添加的内容与已经存在的内容。 (我正在从 xsd 生成一个 class 文件,并用它序列化和反序列化数据。)

我采用这种导入基础 xsd 的方法,这样我就不需要触及 base.xsd 文件,但是是否无法在您的自定义命名空间中扩展导入的元素?

我最初是添加到 base.xsd 并导入我的 custom.xsd 但是继续添加到 base.xsd 变得非常乏味,同时也使添加到替代组 SpecificResource 变得困难。

您不能扩展 xs:element,您只能扩展 xs:complexType。 您可以引用在 xs:schema 元素中定义的属性(即根属性),但您必须使用其目标命名空间对其进行限定。 此外,xs:import 中的名称空间必须与源 xsd 文件匹配(您的不匹配 http/https)。

Base.xsd

<?xml version="1.0" encoding="utf-8" ?>
<!-- Created with Liquid Studio 2020 (https://www.liquid-technologies.com) -->
<xs:schema xmlns="http://www.base.com" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.base.com" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="SpecificResource" type="SpecificResource" abstract="true" />
    <xs:complexType abstract="true" name="SpecificResource">
        <xs:anyAttribute namespace="##other" processContents="lax" />
    </xs:complexType>
    <xs:complexType name="FileSpec">
        <xs:sequence>
            <xs:element name="Disposition" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="NetworkHeader" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="Example" type="xs:string" use="optional" />
        <xs:anyAttribute namespace="##other" processContents="lax" />
    </xs:complexType>
</xs:schema>

Main.xsd

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid Studio 2020 (https://www.liquid-technologies.com)-->
<xs:schema xmlns:cus="https://www.custom.com" xmlns="http://www.base.com" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="https://www.custom.com" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:import schemaLocation=".\base.xsd" namespace="http://www.base.com" />
    <xs:attribute name="URL" type="xs:string" />
    <xs:attribute name="customattribute" type="xs:NMTOKEN" />
    <xs:element name="SpecRes1" type="cus:SpecRes1" substitutionGroup="SpecificResource" />
    <xs:complexType name="SpecRes1">
        <xs:complexContent>
            <xs:extension base="SpecificResource">
                <xs:attribute ref="cus:customattribute" />
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="fullfilespec">
        <xs:complexContent>
            <xs:extension base="FileSpec">
                <xs:attribute ref="cus:URL" use="optional" />
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:schema>