Xerces Whitespaces ignorieren!
-
Moin!
Weiß jemand wie man in Xerces-C++ die Whitespaces zwischen den einzelnen Elementen ignoriert?!
<?xml version="1.0" encoding="UTF-8"?> <DI> <foo> <bar>test123</bar> </foo> </DI>So würde der Parser u.a. den ersten Whitespace zwischen dem root-Element und <foo> mitzählen.
Ich finde keine Funktion in der API um diese Whitespaces zu ignorieren. Kann mir zwar ein Workaround basteln und auf TEXT_NODE etc. testen, ist aber etwas langwierig!Gruß
Sdy
-
Ich denk mal dass du mit Fragen zu Xerxes im Framework-Forum besser aufgehoben bist. Hier treibt sich eigentlich hauptsächlich Standard-C++ und boost etc. rum.
-
So Lösung gefunden! Da es mehrere Threads bei Google dazu gibt und ich keine Lösung darauf gefunden habe, poste ich mal die Lösung:
XSD:
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/cfsh" xmlns:tns="http://www.example.org/cfsh" elementFormDefault="qualified"> <element name="DI" type="tns:bla"></element> <complexType name="bla"> <sequence> <element name="foo" type="tns:NewType"></element> </sequence> </complexType> <complexType name="NewType"> <sequence> <element name="bar" type="string" maxOccurs="1" minOccurs="1"></element> </sequence> </complexType> </schema>XML:
<?xml version="1.0" encoding="UTF-8"?> <tns:DI xmlns:tns="http://www.example.org/cfsh" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/cfsh cfsh.xsd "> <tns:foo> <tns:bar>test</tns:bar> </tns:foo> </tns:DI>1. Der Parser muss validieren können:
http://xerces.apache.org/xerces-c/apiDocs-3/classAbstractDOMParser.html#993d73f69cbddfddfd959f80969f2fccparser_->setValidationScheme(XercesDOMParser::Val_Auto);(ob Auto oder Always ist dabei egal)
2. Dann muss man dem Parser sagen, dass er das Schema auch parsen soll:
http://xerces.apache.org/xerces-c/apiDocs-3/classAbstractDOMParser.html#60a217cdd2dc3cc38a0bde6672f67607parser_->setDoSchema(true);3. Abhängigkeit zwischen den Namespaces und dem vorherigen Befehl:
Note: If (void AbstractDOMParser::setDoSchema ( const bool newState ) ) set to true, namespace processing must also be turned on.
parser_->setDoNamespaces(true);4. Ignorieren der Whitespaces:
http://xerces.apache.org/xerces-c/apiDocs-3/classAbstractDOMParser.html#e3411bea02fd1e83b8f293854a5adc03parser_->setIncludeIgnorableWhitespace(false);Nochmal am Stück:
XercesDOMParser* parser_ = new XercesDOMParser; parser_->setValidationScheme(XercesDOMParser::Val_Auto); parser_->setDoSchema(true); parser_->setDoNamespaces(true); parser_->setIncludeIgnorableWhitespace(false);Gruß Sdy