嵌套元素中的XML模式扩展

嵌套元素中的XML模式扩展,xml,xsd,schema,Xml,Xsd,Schema,这两个模式文件是我为理解xml/xsd中的扩展过程而编写的示例。第一个具有基本定义,并且只有一个元素。在第二个模式中,我希望将特定元素从第一个“扩展”到嵌套结构中。这些文件位于不同的名称空间中 Myschema1.xsd <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetName

这两个模式文件是我为理解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”中添加元素“慷慨”,但我得到了以下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>

p1:Nome
p1:Nome
0
p1:Logradouro
p1:CEP
p1:Cidade
p1:Nome
0
p1:Logradouro
p1:CEP
p1:Cidade
p1:Nome
0
M
有可能吗?我怎么做

当您说“我得到下面的XML”时,您大概是在使用某个特定的工具集从模式生成此XML。但是你还没有说你用什么工具来做这个

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


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

哦,抱歉。的确,我正在使用eclipse创建这些xsd和xml文件。我也在使用eclipse来验证这个xml文件。