etiquetas estructura esquemas arbol ruby xml xsd libxml2

ruby - estructura - xml arbol



Validación de XML: No hay declaración global coincidente disponible para la raíz de validación (3)

Acabo de disparar desde la cadera, pero ¿ha intentado convertir el XML :: Document que contiene el esquema en un XML :: Schema?

http://libxml.rubyforge.org/rdoc/classes/LibXML/XML/Schema.html

No sé si marcaría la diferencia, pero vale la pena intentarlo.

Estoy intentando validar el siguiente XML en un esquema XSD usando Ruby. Simplemente no funciona, se detiene con un mensaje de error diciéndome

Error: Elemento ''solicitud'': No hay declaración global coincidente disponible para la raíz de validación.

Tal vez es el espacio de nombres? ¿Algunas ideas?

XML

<?xml version="1.0" encoding="UTF-8"?> <request type="test" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <channel name="channel"> <username>user</username> <password>pass</password> </channel> <hotel id="1"> <date from="2009-07-07" to="2009-07-17"/> <room id="1"> <allocation>10</allocation> </room> </hotel> </request>

XSD

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- channel --> <xsd:element name="channel"> <xsd:attribute name="name" use="required" type="xsd:string" /> <xsd:sequence> <xsd:element username="name" use="required" type="xsd:string"/> <xsd:element password="country" use="required" type="xsd:string"/> </xsd:sequence> </xsd:element> <!-- hotel --> <xsd:element name="hotel"> <xsd:attribute name="id" use="required" type="xsd:string" /> <xsd:sequence> <xsd:element name="hotel"> <xsd:attribute name="from" use="required" type="xsd:string" /> <xsd:attribute name="to" use="required" type="xsd:string" /> </xsd:element> <xsd:element ref="room" minOccurs="1"/> </xsd:sequence> </xsd:element> <!-- room --> <xsd:element name="room"> <xsd:sequence> <xsd:element name="allocation" type="xsd:string"></xsd:element> <xsd:element ref="hotel" minOccurs="1"/> </xsd:sequence> <xsd:attribute name="id" use="required" type="xsd:string" /> </xsd:element> <!-- building all together --> <xsd:element name="request"> <xsd:attribute name="type" use="required" type="xsd:string" /> <xsd:complexType> <xsd:sequence> <xsd:element ref="channel" maxOccurs="1"/> <xsd:element ref="hotel" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>

Código Ruby

require "xml" document = LibXML::XML::Document.file("/tmp/test.xml") schema = LibXML::XML::Document.file("/tmp/request.xsd") result = document.validate_schema(schema) do |message,flag| log.debug(message) puts message end


Es un error críptico, pero es probable que sea porque tu XSD está mal formado. Por ejemplo, los contenidos del canal, del hotel (tanto los elementos internos como externos), de la habitación y de las xsd:element solicitud xsd:element deben estar envueltos en etiquetas xsd:complexType . Además, el use solo es válido en xsd:attribute , not xsd:element . Para los elementos, use minOccurs y maxOccurs (aunque ambos valores predeterminados son 1, por lo que no son realmente necesarios en este caso). Además, su elemento exterior de hotel contiene un elemento de habitación, que debe contener un elemento de hotel, creando un bucle infinito. Además, no nombra sus elementos de nombre de usuario y contraseña correctamente. Finalmente, ese elemento interno del hotel probablemente debería ser la fecha. Esto es lo que creo que estás buscando:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- channel --> <xsd:element name="channel"> <xsd:complexType> <xsd:sequence> <xsd:element name="username" type="xsd:string"/> <xsd:element name="password" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="name" use="required" type="xsd:string" /> </xsd:complexType> </xsd:element> <!-- hotel --> <xsd:element name="hotel"> <xsd:complexType> <xsd:sequence> <xsd:element name="date"> <xsd:complexType> <xsd:attribute name="from" use="required" type="xsd:string" /> <xsd:attribute name="to" use="required" type="xsd:string" /> </xsd:complexType> </xsd:element> <xsd:element ref="room" minOccurs="1"/> </xsd:sequence> <xsd:attribute name="id" use="required" type="xsd:string" /> </xsd:complexType> </xsd:element> <!-- room --> <xsd:element name="room"> <xsd:complexType> <xsd:sequence> <xsd:element name="allocation" type="xsd:string"></xsd:element> </xsd:sequence> <xsd:attribute name="id" use="required" type="xsd:string" /> </xsd:complexType> </xsd:element> <!-- building all together --> <xsd:element name="request"> <xsd:complexType> <xsd:sequence> <xsd:element ref="channel" maxOccurs="1"/> <xsd:element ref="hotel" maxOccurs="1"/> </xsd:sequence> <xsd:attribute name="type" use="required" type="xsd:string" /> </xsd:complexType> </xsd:element> </xsd:schema>


Recibí el mismo mensaje de error críptico por una razón diferente.

La primera línea de mi archivo de esquema tenía un espacio de nombres no prefijado:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.sec.gov/edgar/document/thirteenf/informationtable" xmlns:ns1="http://www.sec.gov/edgar/common" targetNamespace="http://www.sec.gov/edgar/document/thirteenf/informationtable" elementFormDefault="qualified" attributeFormDefault="unqualified">

Tenga en cuenta el atributo ''xmlns =''. Esto coloca todos los elementos declarados en el esquema en el espacio de nombres http://www.sec.gov/edgar/document/thirteenf/informationtable (a menos que se especifique lo contrario con un prefijo de espacio de nombres). Pero el archivo XML que intentaba validar no tenía un espacio de nombres predeterminado y no prefijado correspondiente:

<informationTable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

Por lo tanto, sus elementos no coincidían con el esquema porque estaban en espacios de nombres "diferentes". Espero que esto sea útil para otros.