apoyo XPath en Xerces-C
Pregunta
Estoy apoyando una aplicación C ++ que utiliza legado Xerces-C para el análisis XML. He estado arruinado por .Net y estoy acostumbrado a utilizar XPath para seleccionar los nodos de un árbol DOM.
¿Hay alguna manera de obtener acceso a algunas funciones XPath limitada en Xerces-C? Busco algo así como selectNodes ( "/ a / bar / baz"). Yo podría hacer esto manualmente, pero XPath es tan agradable en comparación.
Solución
Vea las preguntas frecuentes xerces.
http://xerces.apache.org /xerces-c/faq-other-2.html#faq-9
¿Tiene Xerces-C ++ XPath apoyo? No.Xerces-C ++ 2.8.0 y Xerces-C ++ 3.0.1 sólo tienen aplicación XPath parcial a los efectos del manejo de las limitaciones de identidad de esquema. Para obtener soporte completo de XPath, puede hacer referencia Apache Xalan C ++ u otros proyectos de código abierto como Pathan.
Es bastante fácil de hacer lo que desee con xalan sin embargo.
Otros consejos
Aquí está un ejemplo de trabajo 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 instalación de la biblioteca y el 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
Resultados
hello world
De acuerdo con la FAQ , Xerces-C soporta parcial aplicación XPath 1:
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 nodos DOMElement solamente, sin pruebas y predicado permitiendo que el operador "//" sólo como el paso inicial.
DOMDocument :: evaluar () evaluar la expresión, que a su vez devuelve una DOMXPathResult .