Поддержка XPath в Xerces-C
Вопрос
Я поддерживаю устаревшее приложение на C ++, которое использует Xerces-C для синтаксического анализа XML.Я был избалован .Net и привык использовать XPath для выбора узлов из дерева DOM.
Есть ли какой-нибудь способ получить доступ к некоторым ограниченным функциям XPath в Xerces-C?Я ищу что-то вроде SelectNodes ("/for/bar/baz").Я мог бы сделать это вручную, но XPath так хорош по сравнению с этим.
Решение
См. часто задаваемые вопросы по xerces.
http://xerces.apache.org/xerces-c/faq-other-2.html#faq-9
Поддерживает ли Xerces-C++ XPath? No.Xerces-C++ 2.8.0 и Xerces-C++ 3.0.1 имеют только частичную реализацию XPath для целей обработки ограничений идентификации схемы.Для полной поддержки XPath вы можете обратиться к Apache Xalan C++ или другим проектам с открытым исходным кодом, таким как Pathan.
Однако с помощью ксалана довольно легко делать то, что вы хотите.
Другие советы
Вот рабочий пример вычисления XPath с помощью Ксерксес 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
В соответствии с Вопросы и ответы, Xerces-C поддерживает частичную реализацию XPath 1:
Тот же движок доступен через DOMDocument::evaluate API чтобы позволить пользователю выполнять простой XPath запросы, включающие только узлы DOMElement , без проверки предикатов и допускающие оператор "//" только в качестве начального шага.
Вы используете DOMDocument::оценить() чтобы вычислить выражение, которое затем возвращает DOMXPathResult.