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#993d73f69cbddfddfd959f80969f2fcc

    parser_->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#60a217cdd2dc3cc38a0bde6672f67607

    parser_->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.

    http://xerces.apache.org/xerces-c/apiDocs-3/classAbstractDOMParser.html#1962795fff331583b34b78229364ded7

    parser_->setDoNamespaces(true);
    

    4. Ignorieren der Whitespaces:
    http://xerces.apache.org/xerces-c/apiDocs-3/classAbstractDOMParser.html#e3411bea02fd1e83b8f293854a5adc03

    parser_->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


Anmelden zum Antworten