Beispiel-XSD schlägt mit "Fehler: keine Erklärung gefunden für das element X"
Trotz des seins ein total Neuling in die xml-parsing-arena, ich war in der Lage zu xsd
zum erstellen von gültigen c++
und kompilieren und verknüpfen erfolgreich, aber der compiler optimiert(?) entfernt die Instanziierung. So, beginnend bei Schritt eins, ich versuche den hello world xml-Beispiel, bei CodeSynthesis. Aber das scheitert:
[wally@lenovotower xml]$ make hello
xsdcxx cxx-tree hello.xsd
g++ -c -o helloschema.o hello.cxx
g++ -g -o hello -lxerces-c helloschema.o hello.c++
[wally@lenovotower xml]$ ./hello
hello.xml:2:8 error: no declaration found for element 'hello'
hello.xml:4:13 error: no declaration found for element 'greeting'
hello.xml:6:9 error: no declaration found for element 'name'
hello.xml:7:9 error: no declaration found for element 'name'
hello.xml:8:9 error: no declaration found for element 'name'
Hallo.c++:
#include <iostream>
#include <stdio.h>
#include "hello.hxx"
using namespace std;
int main (void)
{
try {
auto_ptr<hello_t> h (hello ("hello.xml"));
for (hello_t::name_const_iterator i (h->name ().begin());
i != h->name().end();
++i)
cout << h->greeting () << ", " << *i << "!" << endl;
}
catch (const xml_schema::exception& e)
{
cerr << e << endl;
return 1;
}
return 0;
}
hello.xml:
<?xml version="1.0"?>
<hello>
<greeting>Hello</greeting>
<name>sun</name>
<name>moon</name>
<name>world</name>
</hello>
Hallo.xsd:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="hello_t">
<xs:sequence>
<xs:element name="greeting" type="xs:string"/>
<xs:element name="name" type="xs:string" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:element name="hello" type="hello_t"/>
</xs:schema>
Ich denke, das ist genau das, was es sagt, zu tun, aber die Befehle funktionieren nicht genau dokumentiert. Ich entdeckte xsdcxx
scheint das richtige zu tun (im Gegensatz zu xsd
generiert C# oder vb.net Ausgabe).
[wally@lenovotower xml]$ xsdcxx --version
CodeSynthesis XSD XML Schema to C++ compiler 3.3.0
Copyright (C) 2005-2010 Code Synthesis Tools CC
Auch, ich weiß nicht ein -I
(dir) und kompiliert glücklich. Könnte es sein, mit den falschen include-Datei irgendwie?
Was mache ich falsch? Vielleicht xsd
ist nicht das richtige Werkzeug?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Persönlich finde ich die Kombination von Python und lxml sehr von unschätzbarem Wert. Ihr XML-Dokument und dem entsprechenden XML-schema funktionieren:
Ich habe nicht alle Fehler aus, die. Ich will sagen, jedoch, dass, obwohl lxml erfordert nicht die Verwendung von xsi:noNamespaceSchemaLocation da lädt er das schema, das Sie angeben, sollten Sie Sie trotzdem verwenden, sofern Sie nicht mit namespaces. Nur weil ein XML-parser ist flexibel, andere vielleicht nicht, das ist eine Tatsache, dass es scheint, Sie haben möglicherweise herausgefunden, die harte Tour. Wenn Sie namespaces verwenden, verwenden xsi:schemaLocation statt xsi:noNamespaceSchemaLocation. Beachten Sie auch, dass MÜSSEN Sie erklären, xsi-namespace über das xmlns:xsi-Attribut, um in der Lage sein, um das xsi:* Attribute.
Ein Beispiel für die Verwendung von xsi:noNamespaceSchemaLocation:
xsd
ist viel zu Schwergewichts-ein parser für unseren Gebrauch. Ich habe gewechselt haben, glücklich und extrem produktiv zu rapidxml statt. rapidxml.sourceforge.net/index.htmGibt es einige Optionen. Das schema Stelle in der Datei hello.xml:
Weitere option ist es, die schema-Speicherort in der Datei Hallo.c++
Wenn wir annehmen, dass die schema-Datei befindet sich in dem Dateipfad /einige/Datei/Pfad/Hallo.xsd
sollten wir statt zu schreiben
schreiben
Lesen Sie mehr dazu in der Codesynthesis FAQ:
Warum bekomme ich "Fehler: keine Erklärung gefunden für das element 'root-element'", wenn ich versuche zu analysieren, um ein gültiges XML-Dokument?
EDIT: Ignorieren Sie diese Antwort. Ich lasse es hier, weil die Kommentare sind es Wert, speichern.
Ihre XSD-sagt:
aber XML sagt:
Vielleicht XSD sollte:
Auch die XML-Datei fehlt ein xsi:schemaLocation Erklärung. Es könnte helfen, einen zu haben.
hello_t
zuhello
an zwei Orten in der .xsd Ursachen Zusammenstellungerror: ‘hello_t’ was not declared in this scope
; ändern, das gibt auch einen anderen compile-Fehlererror: no matching function for call to ‘std::auto_ptr<hello>::auto_ptr(hello)’
<hello xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="hello.xsd">
ist das, was Ihr<hello>
element Aussehen soll. Ob das helfen wird, mit xsdcxx ist immer noch ein Rätsel, bis Sie es versuchen. 🙂