【问题标题】:Queries related to extending <complexType> from one XSD to another与将 <complexType> 从一个 XSD 扩展到另一个 XSD 相关的查询
【发布时间】:2016-03-30 15:32:47
【问题描述】:

假设我在standard.xsd 文件下面有一段代码,

<xs:complexType name="StdBasicTags">
        <xs:sequence>
            <xs:element name="Name" type="xs:string" nillable="true">
                <xs:annotation>
                    <xs:documentation>Name</xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

现在我有另一个 XSD 文件,它包含上面的文件,并在上面的 complexType StdBasicTags 上添加了一些额外的元素

文件名为fullStandard.xsd,我扩展StdBasicTags的方式如下:

<xs:include schemaLocation="standard.xsd"/>
........
........
    <xs:complexType name="FullStdBasicTags">
            <xs:complexContent>
                <xs:extension base="StdBasicTags">
                    <xs:sequence>
                        <xs:element name="Surname" type="xs:string">
                            <xs:annotation>
                                <xs:documentation>Last name</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>

我有以下疑问,

  1. 我正在使用许可的 Altova XmlSpy 工具为 fullStandard.xsd 文件生成示例 xml,但我只能看到 Name 元素,而不是预期的 Surname 元素。谁能告诉它可能的原因是什么,我错过了什么?

  2. 我必须提供另一个名称 FullStdBasicTags 来扩展 StdBasicTags 并添加一个新元素。在这种情况下,完整的最终 XML 文件的输出是什么?这个想法是让NameSurname 在同一个父complexType StdBasicTags 下。

  3. 最后,我期待的架构/输出有什么问题吗?

注意**这两个文件都得到了正确验证。这个想法也是为了实现我刚才提到的,而不对 standard.xsd 文件进行任何更改。

**更新 我很惊讶直到现在没有人给我任何建议。同时我尝试了这个,

   <xs:element name="FullNewRoot">
    <xs:complexType>
      <xs:sequence>
          <xs:element ref="rootElementName"/>
      </xs:sequence>
    </xs:complexType>
   </xs:element>

其中rootElementName 是standard.xsd 的根元素。现在添加后,我可以看到其他元素。但现在的问题是,首先出现的是整个 standard.xsd 结构,然后出现了我在 fullStandard.xsd 中重新定义的任何内容,而我只想要它们一次。

请提出一些建议。

【问题讨论】:

  • 请显示完整 XML Schema 文档,我们可以使用这些文档来重现您的问题。例如,String 类型的定义未显示。您希望对 fullstandard.xsd 有效的示例 XML 文档会很有帮助。更多帮助在这里:stackoverflow.com/help/mcve.
  • 嗨@Mathias Müller,Stringxs:string 一样。我已经编辑了这个问题。我希望现在这是一个最小、完整和可验证的示例。

标签: xml xsd xml-parsing xmlspy


【解决方案1】:

请在下面找到您问题的答案。

  1. 可能的原因是元素的类型。如果您使用的是 StdBasicTags,则类型应为 FullStdBasicTags。

  2. 父类型不能引用子类型中添加的新属性。此处适用相同的继承原则。

请在下面找到示例。

StdSchema.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/StdSchema"
    xmlns:tns="http://www.example.org/StdSchema" elementFormDefault="qualified">
    <complexType name="StdBasicTags">
        <sequence>
            <element name="Name" type="string" nillable="true">
                <annotation>
                    <documentation>Name</documentation>
                </annotation>
            </element>
        </sequence>
    </complexType>
</schema>

FullSchema.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/FullSchema"
    xmlns:tns="http://www.example.org/FullSchema" elementFormDefault="qualified"
    xmlns:tst="http://www.example.org/StdSchema">
    <include schemaLocation="StdSchema.xsd" />
    <import schemaLocation="StdSchema.xsd" namespace="http://www.example.org/StdSchema"></import>
    <complexType name="FullStdBasicTags">
        <complexContent>
            <extension base="tst:StdBasicTags">
                <sequence>
                    <element name="Surname" type="string">
                        <annotation>
                            <documentation>Last name</documentation>
                        </annotation>
                    </element>
                </sequence>
            </extension>
        </complexContent>
    </complexType>

    <element name="TestTag" type="tns:FullStdBasicTags"/>
</schema>

示例 XML:

<?xml version="1.0" encoding="UTF-8"?>
<tns:TestTag xmlns:tns="http://www.example.org/FullSchema" xmlns:tns1="http://www.example.org/StdSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/FullSchema FullSchema.xsd ">
  <tns1:Name>tns1:Name</tns1:Name>
  <tns:Surname>tns:Surname</tns:Surname>
</tns:TestTag>

【讨论】:

  • 感谢您的宝贵时间。但是第二个FullSchema.xsd 文件无效,并出现以下错误:src-include.2.1: The included schema's target namespace 'http://www.example.org/StdSchema' must be absent or match the including schema's value 'http://www.example.org/FullSchema'. 我之前尝试过类似的事情,但这个错误不会让文件得到验证。知道可以在这里做什么吗?我在这两个文件中都尝试了几种命名空间的组合。
  • 我已经从 FullSchema.xsd 中删除了&lt;!--&lt;include schemaLocation="StdSchema.xsd"/&gt;--&gt; 标签,现在它是有效的。
  • 为什么编辑被拒绝了?您在哪里看到 标记在 xsd 文件中以相同的类型出现。一个需要 targetNameSpace 相同,另一个需要它们不同。请在拒绝任何编辑之前去验证文件一次!!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多