2009-07-09 8 views
6

Apoyo una aplicación heredada de C++ que usa Xerces-C para el análisis de XML. He sido mimado por .Net y estoy acostumbrado a usar XPath para seleccionar nodos de un árbol DOM.Soporte de XPath en Xerces-C

¿Hay alguna forma de acceder a algunas funcionalidades limitadas de XPath en Xerces-C? Estoy buscando algo como selectNodes ("/ for/bar/baz"). Podría hacerlo manualmente, pero XPath es muy agradable en comparación.

Respuesta

4

Consulte la xerces faq.

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

¿El Xerces-C++ XPath apoyo? No.Xerces-C++ 2.8.0 y Xerces-C++ 3.0.1 solo tienen una implementación parcial de XPath con el fin de manejar las restricciones de identidad del esquema. Para obtener soporte completo de XPath, puede referirse a Apache Xalan C++ u otros proyectos de código abierto como Pathan.

Sin embargo, es bastante fácil hacer lo que quiera usando xalan.

1

De acuerdo con la FAQ, Xerces-C soporta XPath parcial 1 aplicación:

El mismo motor se pone a disposición a través de la DOMDocument :: evaluar API para que el usuario realice XPath simples consultas que implican DOMElement nodos solamente, sin pruebas de predicados y que permiten al operador "//" solo como el paso inicial .

Usa DOMDocument::evaluate() para evaluar la expresión, que luego devuelve DOMXPathResult.

+0

¿Alguien utiliza esta funcionalidad? Ha funcionado? Si es así, ¿para qué versiones de Xerces-C? –

+0

@AdamTegen Sí, sé que es 6 años después, pero Xerces sigue siendo popular. Proporcioné un ejemplo de cómo lograr la evaluación de XPath con Xerces 3.1.2. –

1

Aquí hay un ejemplo de funcionamiento de la evaluación XPath con Xerces 3.1.2.

XML de ejemplo

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

compilar y ejecutar (asume xerces estándar de instalación de la biblioteca y del archivo de C++ llamado xpath.cpp)

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

Resultado

hello world