Domanda

sto sostenendo un'applicazione legacy C ++ che utilizza Xerces-C per l'analisi XML. Sono stato viziato da Net e sono abituato ad usare XPath per selezionare i nodi da un albero DOM.

C'è un modo per ottenere l'accesso alcune funzionalità XPath limitato Xerces-C? Sto cercando qualcosa di simile selectNodes ( "/ per / bar / baz"). Potrei farlo manualmente, ma XPath è così bello in confronto.

È stato utile?

Soluzione

Vedere la faq xerces.

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

Fa Xerces-C ++ il supporto XPath? No.Xerces-C ++ 2.8.0 e Xerces-C ++ 3.0.1 hanno solo implementazione XPath parziale ai fini della movimentazione vincoli Schema identità. Per il supporto completo XPath, è possibile fare riferimento ++ o di altri progetti open source Apache Xalan C come Pathan.

E 'abbastanza facile da fare ciò che si vuole utilizzare xalan tuttavia.

Altri suggerimenti

Ecco un esempio di lavoro di valutazione XPath con Xerces 3.1.2 .

XML di esempio

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

Compilare ed eseguire (presuppone xerces standard di installazione della libreria e file C ++ chiamato xpath.cpp )

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

Risultato

hello world

Secondo il FAQ , Xerces-C supporta parziale implementazione XPath 1:

  

Lo stesso motore è reso disponibile   attraverso il DOMDocument :: valutare API   per permettere all'utente di eseguire semplici XPath   query che coinvolgono i nodi DOMElement   solo, senza alcun test predicato e   permettendo all'operatore "//" solo come   passo iniziale.

Si utilizza DOMDocument :: valutare () per valutare l'espressione, che poi restituisce un DOMXPathResult .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top