0
votes

These 2 schemas files are examples that I've written to understand the process of extension in xml/xsd. The first one has the basic definitions and with only one element. In the second schema I want to "extend" a specific element into nested structure from first one. These files are in different namespaces.

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>

I would like to add the element 'Genero' inside of 'IdentificacaoTipo', but I get the following 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>

Is possible do that? How can I do it?

1

1 Answers

0
votes

When you say "I get the following XML", presumably you are generating this XML from the schema using some particular toolset. But you haven't said what tools you are using for this.

I don't know if there is a tool that generates instances from a schema that uses derivation by extension, but you can certainly write an instance that conforms to your schema "by hand".

In general, though, if you want an instance to be validated against a type derived by extension, you have to use an xsi:type attribute on the containing element, which is pretty ugly and may well make the whole mechanism unsuited to your purposes.