Validieren von XML: Keinen passenden global-Deklaration stehen für die Validierung root
Ich versuche zum validieren der folgenden XML gegen ein XSD-schema mit Ruby.
Es funktioniert einfach nicht, Stoppt mit einer Fehlermeldung, die sagen mir
Fehler: Element 'Anfrage': No matching Globale Deklaration zur Verfügung, die für die Validierung root.
Vielleicht ist es der Namensraum? Irgendwelche Ideen?
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>
Ruby-code
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es eine kryptische Fehlermeldung, aber es ist wahrscheinlich, weil Ihre XSD ungültig ist. Zum Beispiel der Inhalt des Kanals, hotel (sowohl die inneren und äußeren Elementen), Zimmer und Anfrage
xsd:element
tags sollten alle eingewickelt inxsd:complexType
- tags. Auchuse
ist nur gültig, aufxsd:attribute
, nichtxsd:element
. Für Elemente, verwenden Sie minOccurs und maxOccurs (obwohl beide der Standardwert 1, also ist Sie nicht wirklich notwendig in diesem Fall). Zusätzlich, Ihre äußere Hotels-element enthält ein Zimmer-element, das enthalten muss, ein hotel element, die Schaffung einer unendlichen Schleife. Weitere, Sie brauchen keine Namen, Ihren Benutzernamen und Ihr Passwort Elemente richtig. Schließlich, dass das inner hotel-Elements sollte wahrscheinlich sein Datum. Hier ist, was ich denke, du suchst:Nur Schießen aus der Hüfte hier, aber haben Sie versucht, die Umwandlung der XML::Dokument halten Sie das schema in ein XML::Schema?
http://libxml.rubyforge.org/rdoc/classes/LibXML/XML/Schema.html
Weiß ich nicht, es würde einen Unterschied machen, aber es ist einen Versuch Wert.
Erhielt ich die gleiche kryptische Fehlermeldung aus einem anderen Grund.
Die erste Zeile des schema-Datei hatte eine unprefixed namespace:
Hinweis: die 'xmlns=' Attribut. Dies platziert alle Elemente deklariert, die in das schema in den Namensraum
http://www.sec.gov/edgar/document/thirteenf/informationtable
(sofern nicht anders angegeben, mit einem namespace-Präfix). Aber die XML-Datei, die ich versucht habe, zu überprüfen haben keinen passenden unprefixed/default namespace:Also seine Elemente nicht übereinstimmen schema, denn Sie waren in "anderen" namespaces. Ich hoffe, dies ist nützlich, um andere.