Frage

Ich unterstütze eine Legacy C ++-Anwendung, die XCES-C für die XML-Parsen verwendet. Ich wurde von .NET verwöhnt und bin es gewohnt, XPath zu verwenden, um Knoten aus einem DOM -Baum auszuwählen.

Gibt es eine Möglichkeit, einen Zugriff auf eine begrenzte XPath-Funktionalität in Xerces-C zu erhalten? Ich suche so etwas wie SelectNodes ("/for/baz/baz"). Ich könnte das manuell tun, aber Xpath ist im Vergleich so schön.

War es hilfreich?

Lösung

Siehe die Xerces -FAQ.

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

Unterstützt Xerces-C ++ XPath? Nr. XERCES-C ++ 2.8.0 und Xerces-C ++ 3.0.1 haben nur eine partielle XPath-Implementierung für die Zwecke der Einschränkungen der Handhabungschemaidentität. Für den vollständigen XPath -Unterstützung können Sie Apache Xalan C ++ oder andere Open -Source -Projekte wie Pathan verweisen.

Es ist jedoch ziemlich einfach, das zu tun, was Sie mit Xalan verwenden möchten.

Andere Tipps

Hier ist ein funktionierendes Beispiel für die XPath -Bewertung mit Xerces 3.1.2.

Probe XML

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

Kompilieren und rennen (Übernimmt die Standard -Installation der Standard -Xerces -Bibliothek und die C ++ - Datei mit dem Namen xpath.cpp)

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

Ergebnis

hello world

Laut dem FAQ, Xerces-C unterstützt eine teilweise XPATH 1-Implementierung:

Die gleiche Engine wird über das Domdocument :: API zur Verfügung gestellt, damit der Benutzer einfache XPATH -Abfragen nur mit Domelementknoten ohne Prädikat -Test und dem Operator "//" nur als anfänglicher Schritt ermöglicht.

Sie nutzen Domdocument :: evaluate () Um den Ausdruck zu bewerten, der dann a zurückgibt DomxpatheResult.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top