Xerces-C中的XPath支持

时间:2009-07-09 19:46:15

标签: xerces xerces-c xpath c++

我支持使用Xerces-C进行XML解析的遗留C ++应用程序。我被.Net宠坏了,并习惯使用XPath从DOM树中选择节点。

有没有办法在Xerces-C中访问一些有限的XPath功能?我正在寻找像selectNodes(“/ for / bar / baz”)之类的东西。我可以手动执行此操作,但相比之下,XPath非常好。

3 个答案:

答案 0 :(得分:5)

参见xerces faq。

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等其他开源项目。

然而,使用xalan做你想做的事情相当容易。

答案 1 :(得分:3)

以下是使用 Xerces 3.1.2 进行XPath评估的工作示例。

示例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库安装和名为 xpath.cpp 的C ++文件)

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

<强>结果

hello world

答案 2 :(得分:1)

根据FAQ,Xerces-C支持部分XPath 1实现:

  

提供相同的引擎   通过DOMDocument :: evaluate API   让用户执行简单的XPath   涉及DOMElement节点的查询   只有,没有谓词测试和   允许“//”运算符仅作为   第一步。

您使用DOMDocument::evaluate()来评估表达式,然后返回DOMXPathResult