Question

Je suis en faveur d'un héritage application C ++ qui utilise Xerces-C pour l'analyse XML. J'ai été gâté par .Net et je suis habitué à utiliser XPath pour sélectionner des noeuds d'un arbre DOM.

Est-il possible d'obtenir l'accès certaines fonctionnalités XPath limitée à Xerces-C? Je cherche quelque chose comme selectNodes ( "/ pour / bar / baz"). Je pouvais le faire manuellement, mais XPath est tellement agréable par comparaison.

Était-ce utile?

La solution

Voir la xerces faq.

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

Est-ce que Xerces-C du XPath de soutien? No.Xerces-C ++ 2.8.0 et Xerces-C ++ 3.0.1 ont seulement la mise en œuvre de XPath partielle aux fins de manipulation des contraintes d'identité du schéma. Pour un support complet XPath, vous pouvez consulter Apache Xalan C ++ ou d'autres projets Open Source comme Pathan.

Il est assez facile de faire ce que vous voulez en utilisant cependant xalan.

Autres conseils

Voici un exemple de travail d'évaluation XPath avec Xerces 3.1.2 .

XML Exemple

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

Compiler et exécuter (ce qui suppose l'installation de la bibliothèque standard xerces et le fichier C ++ appelé xpath.cpp )

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

Résultat

hello world

Selon le FAQ , Xerces-C prend en charge la mise en oeuvre partielle XPath 1:

  

Le même moteur est mis à la disposition   à travers le DOMDocument :: évaluer API   de laisser l'utilisateur effectuer XPath simples   les requêtes impliquant des noeuds DOMElement   seulement, sans test de prédicat et   permettant à l'opérateur « // » seulement comme   l'étape initiale.

Vous utilisez DOMDocument :: evaluate () pour évaluer l'expression, qui renvoie alors un DOMXPathResult .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top