2009-07-09 8 views
6

Obsługuję starszą wersję aplikacji C++, która używa Xerces-C do analizy XML. Zostałem rozpieszczony przez .Net i jestem przyzwyczajony do używania XPath do wybierania węzłów z drzewa DOM.Obsługa XPath w Xerces-C

Czy istnieje sposób na uzyskanie dostępu do niektórych funkcji XPath w Xerces-C? Szukam czegoś takiego jak selectNodes ("/ for/bar/baz"). Mogłem to zrobić ręcznie, ale XPath jest tak miły w porównaniu.

Odpowiedz

4

Zobacz xerces faq.

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

Czy XERCES-C++ XPath pomocy? Numer Xerces-C++ 2.8.0 i Xerces-C++ 3.0.1 mają tylko częściową implementację XPath w celu obsługi ograniczeń dotyczących tożsamości w schemacie. Aby uzyskać pełną obsługę XPath, możesz polecić Apache Xalan C++ lub inne projekty Open Source, takie jak Pathan.

Jest dość łatwo zrobić, co chcesz, używając xalan.

1

Według FAQ, Xerces-C obsługuje częściowy XPath 1 wdrożenia:

Ten sam silnik jest udostępniona przez DOMDocument :: ocenić API aby pozwolić użytkownikowi wykonywanie prostych zapytań XPath udziałem DOMElement tylko węzły: , bez testowania predykatów i , zezwalając operatorowi "//" tylko jako początkowy krok .

Używa się DOMDocument::evaluate() do oceny wyrażenia, które następnie zwraca DOMXPathResult.

+0

Czy ktoś korzystał z tego funkcjonalność? Czy to zadziałało? Jeśli tak, dla jakich wersji Xerces-C? –

+0

@AdamTegen Tak, wiem, że to 6 lat później, ale Xerces jest nadal popularny. Podałem przykład, jak wykonać ocenę XPath za pomocą Xerces 3.1.2. –

1

Oto działający przykład oceny XPath z Xerces 3.1.2.

XML Przykładowy

<?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; 
} 

skompilować i uruchomić (zakłada standardowe Xerces instalacji biblioteki i C plików ++ o nazwie xpath.cpp)

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

Wynik

hello world