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.

¿Fue útil?

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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top