XML расширение схемы во вложенных элементах - PullRequest
0 голосов
/ 12 марта 2020

Эти 2 файла схемы являются примерами, которые я написал, чтобы понять процесс расширения в xml / xsd. Первый имеет базовые определения c и содержит только один элемент. Во второй схеме я хочу «расширить» указанный элемент c во вложенную структуру из первой. Эти файлы находятся в разных пространствах имен.

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>

Я хотел бы добавить элемент 'Genero' внутри «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>

Возможно ли это сделать? Как мне это сделать?

1 Ответ

0 голосов
/ 12 марта 2020

Когда вы говорите «Я получаю следующее XML», вероятно, вы генерируете это XML из схемы, используя какой-то определенный набор инструментов. Но вы еще не сказали, какие инструменты вы используете для этого.

Я не знаю, существует ли инструмент, который генерирует экземпляры из схемы, которая использует деривацию по расширению, но вы, безусловно, можете написать экземпляр, который соответствует вашей схеме «вручную».

В общем, однако, если вы хотите, чтобы экземпляр был проверен на соответствие типу, производному от расширения, вы должны использовать атрибут xsi:type для содержащего элемента, что довольно уродливо и вполне может сделать весь механизм не подходит для ваших целей.

...