Problem mit Xerxes und XML Validation
-
Hallo,
ich weiß nicht, ob ich hier richtig bin, aber vielleicht könnt ihr mir helfen. Ich will eine XML Datei mit Xerxes-C++ laden. Dies klappt auch, aber ich bekomme beim validieren Fehler. Vielleicht weiß von euch jemand genaueres. Ich vermute mal er findet das xsd File nicht, aber es liegt im gleichen Ordner wie das xml File.

Ausgabe:
`Error 5 no declaration found for element 'interfacedescription'
`
Das Xsd-File (icf.xsd):
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="xs3p.xsl"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified" > <xsd:annotation> <xsd:documentation>Description of an interface</xsd:documentation> </xsd:annotation> <xsd:element name="interfacedescription"> <xsd:annotation> <xsd:documentation>Root element</xsd:documentation> </xsd:annotation> </xsd:element> </xsd:schema>Das Xml File:
<?xml version="1.0" encoding="utf-8"?> <interfacedescription xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:noNamespaceSchemaLocation="icf.xsd"> </interfacedescription>Die Methode zum Laden:
XMLPlatformUtils::Initialize(); parser = new XercesDOMParser(); parser->setValidationScheme(XercesDOMParser::Val_Always); parser->setDoNamespaces(true); parser->setCreateSchemaInfo(true); parser->setDoSchema(true); errHandler = (ErrorHandler*)new IcFileHandler(); parser->setErrorHandler(errHandler); parser->parse(filename.c_str()); DOMDocument* doc = parser->getDocument();Der IcFileHandler überschreibt die Klasse xercesc::HandlerBase,
um das XML-File zu validieren:void IcFileHandler::error(const SAXParseException& exc) { cout << endl; cout << "Error " << exc.getLineNumber() << "\t" << XMLString::transcode(exc.getMessage()) << endl; throw exc; } void IcFileHandler::fatalError(const SAXParseException& exc) { cout << endl; cout << "Fatal " << exc.getLineNumber() << "\t" << XMLString::transcode(exc.getMessage()) << endl; throw exc; } void IcFileHandler::warning(const SAXParseException& exc) { cout << endl; cout << "Warning " << exc.getLineNumber() << "\t" << XMLString::transcode(exc.getMessage()) << endl; throw exc; }
-
Habe jetzt eine Lösung gefunden. Anscheinend benutzt er nicht das xsd File, dass ich in der XML-Datei angegeben habe. Also habe ich es über meinen CPP-Code gesetzt
parser->setExternalNoNamespaceSchemaLocation("icf.xsd");nun klappt es
