4 Stimmen

Die Beispiel-XSD schlägt mit "Fehler: Keine Deklaration gefunden für Element X" fehl.

Trotz meiner völligen Unerfahrenheit auf dem Gebiet des XML-Parsings konnte ich xsd verwenden, um gültiges C++ zu erstellen und erfolgreich zu kompilieren und zu verlinken, aber der Compiler hat die Instantiierung opti miert (?). Also, von vorne anfangend, versuche ich das Hello World XML-Beispiel bei CodeSynthesis. Aber das schlägt fehl:

[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 Fehler: keine Deklaration gefunden für Element 'hello'
hello.xml:4:13 Fehler: keine Deklaration gefunden für Element 'greeting'
hello.xml:6:9 Fehler: keine Deklaration gefunden für Element 'name'
hello.xml:7:9 Fehler: keine Deklaration gefunden für Element 'name'
hello.xml:8:9 Fehler: keine Deklaration gefunden für Element 'name'

hello.c++:

#include <iostream>
#include <stdio.h>
#include "hello.hxx"
using namespace std;
int main (void)
{
        try {
                auto_ptr 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"?>

  <greeting>Hello</greeting>

  <name>sun</name>
  <name>moon</name>
  <name>world</name>

hello.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, dass ich genau das tue, was dort steht, aber die Befehle funktionieren nicht genau wie dokumentiert. Ich habe festgestellt, dass xsdcxx anscheinend das Richtige tut (im Gegensatz zu xsd, das C# oder vb.net-Ausgabe generiert).

[wally@lenovotower xml]$ xsdcxx --version
CodeSynthesis XSD XML Schema to C++ compiler 3.3.0
Copyright (C) 2005-2010 Code Synthesis Tools CC

Außerdem füge ich kein -I(Verzeichnis) hinzu und es kompiliert fröhlich. Könnte es sein, dass es irgendwie die falsche Include-Datei verwendet?

Was mache ich falsch? Vielleicht ist xsd nicht das richtige Werkzeug?

3voto

Erik Sjölund Punkte 9620

Es gibt einige Möglichkeiten. Der Schema-Ort kann in der Datei hello.xml angegeben werden:

  Hello

  sun
  moon
  world

Eine andere Option ist es, den Schema-Ort in der Datei hello.c++ anzugeben

Wenn wir davon ausgehen, dass sich die Schema-Datei am Dateipfad /some/file/path/hello.xsd befindet

sollten wir stattdessen schreiben

auto_ptr h (hello ("hello.xml"));

schreiben

xml_schema::properties properties;
properties.no_namespace_schema_location("file:///some/file/path/hello.xsd");
auto_ptr h (hello ("hello.xml", 0, properties));

Sie können mehr darüber in den Codesynthesis FAQ lesen:

Warum erhalte ich die Fehlermeldung "error: no declaration found for element 'root-element'", wenn ich versuche, ein gültiges XML-Dokument zu parsen?

2voto

Persönlich finde ich die Kombination von Python und lxml ziemlich unverzichtbar. Ihr XML-Dokument und das entsprechende XML-Schema funktionieren einwandfrei:

from lxml import etree

xsddoc = etree.parse('hello.xsd')
xsd = etree.XMLSchema(xsddoc)
xml_parser = etree.XMLParser(schema=xsd)
xmldoc = etree.parse('hello.xml', parser=xml_parser)

Ich habe dabei keine Fehler erhalten. Ich sage jedoch, dass, obwohl lxml nicht erfordert, dass Sie xsi:noNamespaceSchemaLocation verwenden, da es das von Ihnen angegebene Schema lädt, sollten Sie es dennoch verwenden, solange Sie keine Namespaces verwenden. Nur weil ein XML-Parser flexibel ist, bedeutet das nicht, dass andere es auch sind, eine Tatsache, die Sie möglicherweise auf die harte Tour herausgefunden haben. Wenn Sie Namespaces verwenden, verwenden Sie statt xsi:noNamespaceSchemaLocation besser xsi:schemaLocation. Beachten Sie auch, dass Sie den xsi-Namespace über das Attribut xmlns:xsi deklarieren MÜSSEN, um die xsi:* Attribute verwenden zu können.

Ein Beispiel für die Verwendung von xsi:noNamespaceSchemaLocation:

  ...

1voto

Dan Breslau Punkte 11294

EDIT: Ignoriere diese Antwort. Ich lasse sie stehen, weil die Kommentare es wert sind, gespeichert zu werden. Dein XSD sagt:

~~aber dein XML sagt:

...

Vielleicht sollte das XSD sein:~~

Außerdem fehlt dem XML eine xsi:schemaLocation Deklaration. Es könnte hilfreich sein, eine zu haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X