Поддержка XPath в Xerces-C - PullRequest
8 голосов
/ 09 июля 2009

Я поддерживаю устаревшее приложение C ++, которое использует Xerces-C для синтаксического анализа XML. Я был избалован .Net и привык использовать XPath для выбора узлов из дерева DOM.

Есть ли способ получить доступ к некоторым ограниченным функциям XPath в Xerces-C? Я ищу что-то вроде selectNodes ("/ for / bar / baz"). Я мог бы сделать это вручную, но XPath настолько хорош для сравнения.

Ответы [ 3 ]

5 голосов
/ 10 июля 2009

См. Часто задаваемые вопросы xerces.

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

Поддерживает ли Xerces-C ++ XPath? Xerces-C ++ 2.8.0 и Xerces-C ++ 3.0.1 имеют только частичную реализацию XPath для обработки ограничений идентификации схемы. Для полной поддержки XPath вы можете обратиться к Apache Xalan C ++ или другим проектам с открытым исходным кодом, таким как Pathan.

Однако довольно легко делать то, что вы хотите, используя xalan.

3 голосов
/ 14 октября 2015

Вот рабочий пример оценки XPath с Xerces 3.1.2 .

Пример 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;
}

Скомпилируйте и запустите (предполагается стандартная установка библиотеки xerces и файл C ++ с именем xpath.cpp )

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

Результат

hello world
1 голос
/ 09 июля 2009

Согласно FAQ , Xerces-C поддерживает частичную реализацию XPath 1:

Тот же двигатель доступен через DOMDocument :: оценить API позволить пользователю выполнять простой XPath запросы с участием узлов DOMElement только без тестирования предикатов и разрешить оператор "//" только в качестве начальный шаг.

Вы используете DOMDocument ::valu () для оценки выражения, которое затем возвращает DOMXPathResult .

...