2010-12-01 39 views
20

XML me confunde a veces, pero estoy tratando de resolver esto. Lo que el vendedor me está diciendo no tiene sentido, pero de nuevo, XML y no me llevo bien :)¿A XML le importa el orden de los elementos?

Tengo un XML que estoy enviando al servicio web de un proveedor que me está dando fallas aleatorias:

<root> 
    <Request> 
     <Driver id="1" VehId="1">...</Driver> 
     <Driver id="2" VehId="1">...</Driver> 
     <Driver id="3" VehId="2">...</Driver> 
     <Vehicle id="1">...</Vehicle> 
     <Vehicle id="2">...</Vehicle> 
     <Driver id="4" VehId="2">...</Driver> 
    </Request> 
</root> 

No hay que comparar XSLT o XSD para ver si mi XML es válido.

El vendedor declara que el XML no es válido porque el Driver # 4 está en el área incorrecta. El XPath para Driver debe ser root/Request/Driver y Vehicle es root/Request/Vehicle.

¿Es común que los analizadores XML fuercen un orden de elementos, especialmente si no hay un XSD para comparar el XML? El apoyo del proveedor es lento para volver conmigo, así que quiero saber qué buena práctica común es.

Seguimiento

que se quejó suficiente para nuestra representante de cuenta por no ser capaz de probar esto (y lo hizo sonar como que estaban tratando de conseguir el apoyo de dinero) que resulta que los desarrolladores han XSD , pero el soporte no. Así que había estado hablando con el grupo equivocado * facepalm *

Obtuve el XSD y hace cumplir un orden específico de elementos.

Ahora luchar contra ellos en lo que respecta a su propia muestra XML no sigue el esquema, pero al menos ahora tengo algo contra qué probar.

+1

El proveedor debe proporcionar un XSD o documentación de respaldo que detalle las suposiciones que el software hace sobre el formato XML, incluido el orden de los elementos. De lo contrario, tienes que adivinar. El software que lee documentos XML no debe hacer cumplir una orden (cuando sea posible), pero no es poco común. Una documentación XSD * is * que define explícitamente las reglas de formato de intercambio. Ver también http://kettle.pentaho.com/. –

Respuesta

16

Si no hay ningún XSD (esquema XML) a mano, entonces todo lo que puede verificar es si su XML está bien formado.

En su caso, lo es. No hay etiquetas XML superpuestas, ni etiquetas XML que se dejan abiertas ni nada por el estilo.

Si el vendedor tiene que hacer cumplir las cosas como el orden en el interior del XML, que debería proporcionar un archivo XSD - de lo contrario, sus "requisitos" no pueden ser validados y verificados ....

+1

Eso es exactamente lo que pensé y quería estar seguro. El analizador XML que creamos funciona correctamente en el XML anterior y no genera ningún error, pero sin un XSD, ¿cómo puede estar realmente seguro? – dragonmantank

+1

Una DTD (si el proveedor usa un conjunto de herramientas antiguas) también puede determinar la validez. – brianary

2

Un esquema XML puede imponer o no el orden de los elementos. Depende del esquema en cuestión. En el sentido más general, el orden de los elementos XML no es importante, a menos que el esquema apropiado especifique lo contrario.

3

vendedores harán lo que quieran hacer, pero es una aplicación no estándar de XML para confiar en el pedido.

XML es declarativo, no de procedimiento. Por lo tanto, no debe ser "paso a paso".

+5

¡Y sin embargo, sus párrafos se procesan en el orden en que los ingresó! – brianary

+0

Gran punto de @brianary. ¡Nunca he visto párrafos en XHTML marcados con atributos para indicar su orden! –

3

Los esquemas XML pueden imponer el orden de los elementos. Si no hay un esquema, ni el orden ni las etiquetas, ni la estructura general, ni el tipo de texto (si es un número ni nada) se prescribe de cualquier manera, en teoría. Por supuesto que ese no es el caso aquí.

Es perfectamente posible analizar * datos de XML sin preocuparse por el orden, pero puede ser más fácil (por ejemplo, al usar SAX, imagino, o cuando eres un bastardo perezoso escribiendo código muy descuidado) para analizar si asumir un cierto orden Aunque incluyen incluyendo algún esquema si quieren un cierto orden, es perfectamente posible que su analizador se atore de todos modos. Sí, no deberían hacer esto, pero obviamente no les importa.

* Al "analizar" no me refiero a "tomar ese documento XML y convertirlo, por ejemplo, en un DOM", sino "tomar ese, por ejemplo, DOM y extraer la información del mismo".

2

El acceso a XML por DOM conserva el orden de los nodos tal como están en su documento XML. Mira aquí:

http://www.w3schools.com/dom/dom_nodes_nodelist.asp

allí se encuentran: Lista

Un nodo de objeto representa una lista de nodos , en el mismo orden que en el XML.

Si el servicio web es depender del orden es una cuestión diferente - que puede ser o no, que depende de la implementación del servicio web.

0

Bueno, creo que la mejor respuesta posible es - pregúnteles. Incluso podrían analizar tu XML como un archivo de texto y, por lo tanto, es posible que necesites saltos de línea y un orden "correcto" de atributos.

Si analizarían esto correctamente, el orden no importaría (al menos no en términos de solicitudes válidas). Según lo veo, deberían construir dos tablas y unirlas con los identificadores provistos.

11

Sé que esto es viejo, pero acabo de llegar a la publicación.

Hasta hoy lo más probable es responder a la pregunta Does XML care about the order of elements con No, unless you use a poorly written xml parser

Sin embargo, hoy en día una aplicación de terceros se quejaron de que los archivos XML que he creado no son válidos. Usan un archivo XSD para validar el xml. Y sí, se puede hacer cumplir la orden o elementos dentro de un archivo xsd:

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="ComplexType"> 
    <xs:sequence> 
     <xs:element minOccurs="0" maxOccurs="1" default="" name="Value1" type="xs:string" /> 
     <xs:element minOccurs="0" maxOccurs="1" default="" name="Value2" type="xs:string" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

La palabra clave es xs:sequence

El elemento de secuencia especifica que los elementos secundarios deben aparecer en una secuencia . Cada elemento secundario puede ocurrir de 0 a cualquier número de veces.

que está en contraste con xs:all a la que no le importa el orden, pero solo permite solo los elementos que se producen cero o una vez.

Especifica que los elementos secundarios pueden aparecer en cualquier orden. Cada elemento hijo puede ocurrir 0 o 1 vez

Cuestiones relacionadas