2009-07-09 10 views
6

Sto supportando un'applicazione legacy C++ che utilizza Xerces-C per l'analisi XML. Sono stato rovinato da .Net e sono abituato a usare XPath per selezionare i nodi da un albero DOM.Supporto XPath in Xerces-C

Esiste un modo per accedere ad alcune funzionalità XPath limitate in Xerces-C? Sto cercando qualcosa come selectNodes ("/ per/bar/baz"). Potrei farlo manualmente, ma XPath è così bello al confronto.

risposta

4

Vedere le xerces faq.

http://xerces.apache.org/xerces-c/faq-other-2.html#faq-9

Does Xerces-C++ XPath sostegno? No.Xerces-C++ 2.8.0 e Xerces-C++ 3.0.1 hanno solo un'implementazione XPath parziale ai fini della gestione dei vincoli di identità dello schema. Per il supporto completo di XPath, è possibile consultare Apache Xalan C++ o altri progetti Open Source come Pathan.

E 'abbastanza facile fare quello che vuoi usando xalan comunque.

1

Secondo la FAQ, Xerces-C supporta XPath parziale 1 applicazione:

Lo stesso motore è reso disponibile attraverso il DOMDocument :: valutare API per consentire all'utente di eseguire semplici XPath query che coinvolgono DOMElement solo i nodi , senza test dei predicati e consentendo all'operatore "//" solo come passaggio iniziale .

Si utilizza DOMDocument::evaluate() per valutare l'espressione, che restituisce quindi un DOMXPathResult.

+0

Qualcuno ha usato questa funzionalità? Ha funzionato? In tal caso, per quali versioni di Xerces-C? –

+0

@AdamTegen Sì, lo so che sono passati 6 anni ma Xerces è ancora popolare. Ho fornito un esempio di come eseguire la valutazione XPath con Xerces 3.1.2. –

1

Ecco un esempio funzionante di valutazione XPath con Xerces 3.1.2.

XML di esempio

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<root> 
    <ApplicationSettings>hello world</ApplicationSettings> 
</root> 

C++

#include <iostream> 
#include <xercesc/dom/DOM.hpp> 
#include <xercesc/dom/DOMDocument.hpp> 
#include <xercesc/dom/DOMElement.hpp> 
#include <xercesc/util/TransService.hpp> 
#include <xercesc/parsers/XercesDOMParser.hpp> 

using namespace xercesc; 
using namespace std; 

int main() 
{ 
    XMLPlatformUtils::Initialize(); 
    // create the DOM parser 
    XercesDOMParser *parser = new XercesDOMParser; 
    parser->setValidationScheme(XercesDOMParser::Val_Never); 
    parser->parse("sample.xml"); 
    // get the DOM representation 
    DOMDocument *doc = parser->getDocument(); 
    // get the root element 
    DOMElement* root = doc->getDocumentElement(); 

    // evaluate the xpath 
    DOMXPathResult* result=doc->evaluate(
     XMLString::transcode("/root/ApplicationSettings"), 
     root, 
     NULL, 
     DOMXPathResult::ORDERED_NODE_SNAPSHOT_TYPE, 
     NULL); 

    if (result->getNodeValue() == NULL) 
    { 
    cout << "There is no result for the provided XPath " << endl; 
    } 
    else 
    { 
    cout<<TranscodeToStr(result->getNodeValue()->getFirstChild()->getNodeValue(),"ascii").str()<<endl; 
    } 

    XMLPlatformUtils::Terminate(); 
    return 0; 
} 

Compilare ed eseguire (presuppone xerces standard di installazione della libreria di file e C++ chiamato xpath.cpp)

g++ -g -Wall -pedantic -L/opt/lib -I/opt/include -DMAIN_TEST xpath.cpp -o xpath -lxerces-c 
./xpath 

Risultato

hello world