【问题标题】:XML schema extension in nested elements嵌套元素中的 XML 模式扩展
【发布时间】:2020-06-24 18:57:43
【问题描述】:

这 2 个模式文件是我为理解 xml/xsd 中的扩展过程而编写的示例。第一个具有基本定义并且只有一个元素。在第二个模式中,我想将特定元素从第一个“扩展”到嵌套结构中。这些文件位于不同的命名空间中。

Myschema1.xsd

<?xml version="1.0"?>
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    targetNamespace="myschema1"
    xmlns="myschema1">


<xs:complexType name="EnderecoTipo">
    <xs:sequence>
        <xs:element name="Logradouro" type="xs:string"></xs:element>
        <xs:element name="CEP" type="xs:string"></xs:element>
        <xs:element name="Cidade" type="xs:string"></xs:element>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="IdentificacaoTipo">
    <xs:sequence>
        <xs:element name="Nome" type="xs:string"></xs:element>
        <xs:element name="Idade" type="xs:int"></xs:element>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="CartaoTipo">
    <xs:sequence>
        <xs:element name="Identificacao" type="IdentificacaoTipo"></xs:element>
        <xs:element name="Endereco" type="EnderecoTipo"></xs:element>
    </xs:sequence>
    <xs:attribute name="idioma" type="xs:string" default="pt-BR"></xs:attribute>
</xs:complexType>

<xs:complexType name="EmpresaTipo">
    <xs:sequence>
        <xs:element name="Nome" type="xs:string"></xs:element>
        <xs:element name="Cartao" type="CartaoTipo"></xs:element>
    </xs:sequence>
    <xs:attribute name="origem" type="xs:string" default="nacional"></xs:attribute>
</xs:complexType>

<xs:element name="Empresa" type="EmpresaTipo"/>

</xs:schema>

Myschema3.xsd:

    <?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    targetNamespace="myschema3"
    xmlns="myschema3"
    xmlns:sch="myschema1">

<xs:import namespace="myschema1" schemaLocation="Myschema1.xsd"></xs:import>

<xs:complexType name="Companhia">
    <xs:complexContent>
        <xs:extension base="sch:EmpresaTipo">
            <xs:sequence>
                <xs:element name="Cartao">
                    <xs:complexType>
                        <xs:complexContent>
                            <xs:extension base="sch:CartaoTipo">
                                <xs:sequence>
                                    <xs:element name="Identificacao">
                                        <xs:complexType>
                                            <xs:complexContent>
                                                <xs:extension base="sch:IdentificacaoTipo">
                                                    <xs:sequence>
                                                        <xs:element name="Genero" type="xs:string" default="M"></xs:element>
                                                    </xs:sequence>
                                                </xs:extension>
                                            </xs:complexContent>
                                        </xs:complexType>
                                    </xs:element>
                                </xs:sequence>
                            </xs:extension>
                        </xs:complexContent>
                    </xs:complexType>
                </xs:element>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

<xs:element name="Companhia" type="Companhia"/>

</xs:schema>

我想在“IdentificacaoTipo”中添加元素“Genero”,但得到以下 XML。

<?xml version="1.0" encoding="UTF-8"?>
<p:Companhia origem="nacional" xmlns:p="myschema3" xmlns:p1="myschema1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="myschema3 Myschema3.xsd ">
  <p1:Nome>p1:Nome</p1:Nome>
  <p1:Cartao idioma="pt-BR">
    <p1:Identificacao>
      <p1:Nome>p1:Nome</p1:Nome>
      <p1:Idade>0</p1:Idade>
    </p1:Identificacao>
    <p1:Endereco>
      <p1:Logradouro>p1:Logradouro</p1:Logradouro>
      <p1:CEP>p1:CEP</p1:CEP>
      <p1:Cidade>p1:Cidade</p1:Cidade>
    </p1:Endereco>
  </p1:Cartao>
  <p:Cartao idioma="pt-BR">
    <p1:Identificacao>
      <p1:Nome>p1:Nome</p1:Nome>
      <p1:Idade>0</p1:Idade>
    </p1:Identificacao>
    <p1:Endereco>
      <p1:Logradouro>p1:Logradouro</p1:Logradouro>
      <p1:CEP>p1:CEP</p1:CEP>
      <p1:Cidade>p1:Cidade</p1:Cidade>
    </p1:Endereco>
    <p:Identificacao>
      <p1:Nome>p1:Nome</p1:Nome>
      <p1:Idade>0</p1:Idade>
      <p:Genero>M</p:Genero>
    </p:Identificacao>
  </p:Cartao>
</p:Companhia>

有可能吗?我该怎么做?

【问题讨论】:

    标签: xml xsd schema


    【解决方案1】:

    当您说“我得到以下 XML”时,可能是您正在使用某些特定工具集从架构生成此 XML。但是你还没有说你为此使用了什么工具。

    我不知道是否有一种工具可以从使用扩展派生的模式生成实例,但您当然可以“手动”编写符合您的模式的实例。

    不过,一般来说,如果您希望根据扩展派生的类型验证实例,则必须在包含元素上使用 xsi:type 属性,这非常难看,并且很可能使整个机制不适合你的目的。

    【讨论】:

    • 哦,对不起。确实,我正在使用 eclipse 创建这些 xsd 和 xml 文件。我也在使用 eclipse 来验证这个 xml 文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    相关资源
    最近更新 更多