Pergunta

Tenho um esquema XML que inclui vários endereços:

<xs:element name="personal_address" maxOccurs="1">
  <!-- address fields go here -->
</xs:element>
<xs:element name="business_address" maxOccurs="1">
  <!-- address fields go here -->
</xs:element>

Dentro de cada elemento de endereço, incluo uma enumeração "Estado dos EUA":

<xs:simpleType name="state">
    <xs:restriction base="xs:string">
        <xs:enumeration value="AL" />
        <xs:enumeration value="AK" />
        <xs:enumeration value="AS" />
                ....
            <xs:enumeration value="WY" />
        </xs:restriction>
</xs:simpleType>

Como faço para escrever a enumeração "Estado dos EUA" uma vez e reutilizá-la em cada um dos meus elementos de endereço?Peço desculpas antecipadamente se esta for uma pergunta óbvia - nunca escrevi um XSD antes.

Minha tentativa inicial é a seguinte:

<xs:element name="business_address" maxOccurs="1">
  <!-- address fields go here -->
  <xs:element name="business_address_state" type="state" maxOccurs="1"></xs:element>
</xs:element>
Foi útil?

Solução

Eu acho que você está nas faixas certas. Eu acho que tem mais a ver com namespaces XML. Experimente o seguinte:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/foo"
    xmlns:tns="http://www.example.org/foo"
    elementFormDefault="qualified">
    <xs:element name="business_address">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="business_address_state"
                    type="tns:state" maxOccurs="1" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:simpleType name="state">
        <xs:restriction base="xs:string">
            <xs:enumeration value="AL" />
            <xs:enumeration value="AK" />
            <xs:enumeration value="AS" />
            <xs:enumeration value="WY" />
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

Observe que o tipo é TNS: Estado não apenas Estado

E então é assim que você usaria:

<?xml version="1.0" encoding="UTF-8"?>
<business_address xmlns="http://www.example.org/foo"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/foo foo.xsd ">
    <business_address_state>AL</business_address_state>
</business_address>

Observe que este XML usa um espaço para nome padrão da mesma forma que o TargetNamespace do XSD

Outras dicas

Embora os namespaces ajudem a manter os esquemas organizados e a prevenir conflitos, não é o espaço para nome acima que permite a reutilização, é a colocação do tipo como um filho imediato dou003Cxs:schema> raiz que o torna um tipo global.(Utilizável dentro do namespace sem o qualificador de namespace e de qualquer lugar onde o namespace tns esteja visível com o tns:qualificador.)

Prefiro construir meus esquemas seguindo a abordagem "Jardim do Éden", que maximiza a reutilização de elementos e tipos (e também pode facilitar a referência lógica externa do tipo/elemento único cuidadosamente criado a partir de, digamos, um dicionário de dados armazenado em um banco de dados .

Observe que, embora o padrão de esquema "Jardim do Éden" ofereça o máximo de reutilização, ele também envolve mais trabalho.No final desta postagem, forneci links para outros padrões abordados na série do blog.

A abordagem do Jardim do Éden http://blogs.msdn.com/skaufman/archive/2005/05/10/416269.aspx

Usa uma abordagem modular definindo todos os elementos globalmente e, como a abordagem Venetian Blind, todas as definições de tipo são declaradas globalmente.Cada elemento é definido globalmente como um filho imediato do nó e seu atributo type pode ser definido como um dos tipos complexos nomeados.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="TargetNamespace" xmlns:TN="TargetNamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="BookInformation" type="BookInformationType"/>
    <xs:complexType name="BookInformationType">
        <xs:sequence>
            <xs:element ref="Title"/>
            <xs:element ref="ISBN"/>
            <xs:element ref="Publisher"/>
            <xs:element ref="PeopleInvolved" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="PeopleInvolvedType">
        <xs:sequence>
            <xs:element name="Author"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="Title"/>
    <xs:element name="ISBN"/>
    <xs:element name="Publisher"/>
    <xs:element name="PeopleInvolved" type="PeopleInvolvedType"/>
</xs:schema>
A vantagem dessa abordagem é que os esquemas são reutilizáveis.Como os elementos e os tipos são definidos globalmente, ambos estão disponíveis para reutilização.Essa abordagem oferece a quantidade máxima de conteúdo reutilizável.As desvantagens são que o esquema é detalhado.Este seria um design apropriado quando você estiver criando bibliotecas gerais nas quais você não possa fazer suposições sobre o escopo dos elementos e tipos do esquema e seu uso em outros esquemas, particularmente em referência à extensibilidade e modularidade.


Como cada tipo e elemento distinto tem uma única definição global, essas partículas/componentes canônicos podem ser relacionados individualmente aos identificadores em um banco de dados.E embora possa à primeira vista parecer uma tarefa manual cansativa e contínua manter as associações entre as partículas/componentes textuais XSD e o banco de dados, o SQL Server 2005 pode de fato gerar identificadores de componentes de esquema canônicos por meio da instrução

CREATE XML SCHEMA COLLECTION

http://technet.microsoft.com/en-us/library/ms179457.aspx

Por outro lado, para construir um esquema a partir das partículas canônicas, o SQL Server 2005 fornece o

SELECT xml_schema_namespace function

http://technet.microsoft.com/en-us/library/ms191170.aspx

CA · NÃO · I · CAL RELACIONADO à matemática.(de uma equação, coordenada, etc.) "Na forma mais simples ou padrão" http://dictionary.reference.com/browse/canonical

Outros padrões de esquema mais fáceis de construir, mas menos reutilizáveis/mais "desnormalizados/redundantes" incluem

A abordagem da Boneca Russa http://blogs.msdn.com/skaufman/archive/2005/04/21/410486.aspx

O esquema possui um único elemento global – o elemento raiz.Todos os outros elementos e tipos são aninhados progressivamente mais profundamente, dando-lhes o nome devido a cada tipo se encaixar naquele acima dele.Como os elementos neste design são declarados localmente, eles não serão reutilizáveis ​​por meio de instruções de importação ou inclusão.

A abordagem da fatia de salame http://blogs.msdn.com/skaufman/archive/2005/04/25/411809.aspx

Todos os elementos são definidos globalmente, mas as definições de tipo são definidas localmente.Desta forma, outros esquemas podem reutilizar os elementos.Com esta abordagem, um elemento global com seu tipo definido localmente fornece uma descrição completa do conteúdo do elemento.Essa 'fatia' de informações é declarada individualmente e depois agregada novamente e também pode ser reunida para construir outros esquemas.

A abordagem dos cegos venezianos http://blogs.msdn.com/skaufman/archive/2005/04/29/413491.aspx

Semelhante à abordagem da Boneca Russa, pois ambas usam um único elemento global.A abordagem Venetian Blind descreve uma abordagem modular nomeando e definindo todas as definições de tipo globalmente (em oposição à abordagem Salami Slice que declara elementos globalmente e tipos localmente).Cada tipo definido globalmente descreve uma "slat" individual e pode ser reutilizada por outros componentes.Além disso, todos os elementos declarados localmente podem ser qualificados para namespace ou não qualificados para namespace (as ripas podem ser "abertas" ou "fechadas") dependendo da configuração do atributo elementFormDefault na parte superior do esquema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top