¿Cómo creo un & # 8220; Estado de los EE. UU. & # 8221; reutilizable? escribir en un esquema XML?

StackOverflow https://stackoverflow.com/questions/227434

  •  03-07-2019
  •  | 
  •  

Pregunta

Tengo un esquema XML que incluye varias direcciones:

<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 dirección, incluyo un " Estado de EE. UU. " enumeración:

<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>

¿Cómo hago para escribir el " Estado de EE. UU. " ¿Enumeración una vez y reutilizándola en cada uno de los elementos de mi dirección? Pido disculpas por adelantado si esta es una pregunta n00b: nunca he escrito un XSD antes.

Mi primera puñalada es la siguiente:

<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>
¿Fue útil?

Solución

Creo que estás en el camino correcto. Creo que es más que ver con los espacios de nombres XML. Intenta lo siguiente:

<?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>

Tenga en cuenta que el tipo es tns: state no solo state

Y así es como lo usarías:

<?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 utiliza un espacio de nombres predeterminado igual al del targetNamespace del XSD

Otros consejos

Mientras que los espacios de nombres ayudan a mantener los esquemas organizados y previenen conflictos, No es el espacio de nombres de arriba lo que permite la reutilización, es la ubicación del tipo como elemento secundario inmediato de < xs: schema > raíz Eso lo hace un tipo global. (Se puede usar dentro del espacio de nombres sin el calificador de espacio de nombres y desde cualquier lugar donde el espacio de nombres de tns esté visible con el calificador de tns).

Prefiero construir mis esquemas siguiendo el " Jardín del Edén " enfoque, que maximiza la reutilización de ambos elementos y tipos (y también puede facilitar la referencia lógica externa del tipo / elemento único cuidadosamente creado desde, por ejemplo, un diccionario de datos almacenado en una base de datos.

Tenga en cuenta que mientras el " Jardín del Edén " El patrón de esquema ofrece la máxima reutilización, también implica la mayor parte del trabajo. En la parte inferior de esta publicación, proporcioné enlaces a los otros patrones cubiertos en la serie de blogs.

& # 8226; El enfoque del Jardín del Edén http: //blogs.msdn.com/skaufman/archive/2005/05/10/416269.aspx

Utiliza un enfoque modular al definir todos los elementos globalmente y, al igual que el enfoque de los ciegos venecianos, todas las definiciones de tipo se declaran globalmente. Cada elemento se define globalmente como un elemento secundario inmediato del nodo y su atributo de tipo se puede establecer en uno de los tipos complejos nombrados.

<?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>
La ventaja de este enfoque es que los esquemas son reutilizables. Dado que tanto los elementos como los tipos se definen globalmente, ambos están disponibles para su reutilización. Este enfoque ofrece la máxima cantidad de contenido reutilizable. Las desventajas son que el esquema es detallado. Este sería un diseño apropiado cuando está creando bibliotecas generales en las que no puede hacer suposiciones sobre el alcance de los elementos y tipos de esquema y su uso en otros esquemas, particularmente en referencia a la extensibilidad y modularidad.


Dado que cada tipo y elemento distinto tiene una definición global única, estas partículas / componentes canónicos pueden relacionarse uno a uno con los identificadores en una base de datos. Y si bien a primera vista puede parecer una tarea manual continua agotadora para mantener las asociaciones entre las partículas / componentes textuales de XSD y la base de datos, SQL Server 2005 puede de hecho generar identificadores de componentes de esquemas canónicos a través de la declaración

CREATE XML SCHEMA COLLECTION

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

A la inversa, para construir un esquema a partir de partículas canónicas, SQL Server 2005 proporciona el

SELECT xml_schema_namespace function

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

ca & # 183; non & # 183; i & # 183; cal     Relacionados con las matemáticas. (de una ecuación, coordenada, etc.)         " en la forma más simple o estándar "          http://dictionary.reference.com/browse/canonical

Otro, más fácil de construir, pero menos resuable / más " desnormalizado / redundante " los patrones de esquema incluyen

& # 8226; El enfoque de Russian Doll http: / /blogs.msdn.com/skaufman/archive/2005/04/21/410486.aspx

El esquema tiene un único elemento global: el elemento raíz. Todos los demás elementos y tipos se anidan progresivamente, lo que le da el nombre debido a que cada tipo se ajusta al que está arriba. Dado que los elementos en este diseño se declaran localmente, no serán reutilizables a través de las declaraciones de importación o inclusión.

& # 8226; El enfoque Salami Slice http: //blogs.msdn.com/skaufman/archive/2005/04/25/411809.aspx

Todos los elementos se definen globalmente, pero las definiciones de tipo se definen localmente. De esta manera otros esquemas pueden reutilizar los elementos. Con este enfoque, un elemento global con su tipo definido localmente proporciona una descripción completa del contenido de los elementos. Esta 'porción' de información se declara individualmente y luego se vuelve a agregar y se puede juntar para construir otros esquemas.

& # 8226; El enfoque de los ciegos venecianos http: / /blogs.msdn.com/skaufman/archive/2005/04/29/413491.aspx

Similar al enfoque de la muñeca rusa en que ambos usan un solo elemento global. El enfoque de los ciegos venecianos describe un enfoque modular al nombrar y definir todas las definiciones de tipo a nivel mundial (a diferencia del enfoque de Salami Slice, que declara elementos globalmente y tipos a nivel local). Cada tipo definido globalmente describe un " listón " y puede ser reutilizado por otros componentes. Además, todos los elementos declarados localmente pueden ser calificados para el espacio de nombres o no calificados para el espacio de nombres (los slats pueden abrirse o cerrarse) dependiendo de la configuración del atributo elementFormDefault en la parte superior del esquema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top