Xerces-C 中的 XPath 支持

发布于 2024-07-26 18:57:15 字数 207 浏览 13 评论 0原文

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

有什么方法可以访问 Xerces-C 中一些有限的 XPath 功能吗? 我正在寻找类似 selectNodes("/for/bar/baz") 的东西。 我可以手动完成此操作,但相比之下,XPath 非常好。

I am supporting a legacy C++ application which uses Xerces-C for XML parsing. I've been spoiled by .Net and am used to using XPath to select nodes from a DOM tree.

Is there any way to get access some limited XPath functionality in Xerces-C? I'm looking for something like selectNodes("/for/bar/baz"). I could do this manually, but XPath is so nice by comparison.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

拥醉 2024-08-02 18:57:16

请参阅 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)。

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

See the xerces faq.

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

Does Xerces-C++ support XPath?
No.Xerces-C++ 2.8.0 and Xerces-C++ 3.0.1 only have partial XPath implementation for the purposes of handling Schema identity constraints. For full XPath support, you can refer Apache Xalan C++ or other Open Source Projects like Pathan.

It's fairly easy to do what you want using xalan however.

探春 2024-08-02 18:57:16

以下是使用 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

Here is a working example of XPath evaluation with Xerces 3.1.2.

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

Compile and run (assumes standard xerces library installation and C++ file named xpath.cpp)

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

Result

hello world
活泼老夫 2024-08-02 18:57:16

根据 常见问题解答,Xerces-C支持部分 XPath 1 实现:

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

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

According to the FAQ, Xerces-C supports partial XPath 1 implementation:

The same engine is made available
through the DOMDocument::evaluate API
to let the user perform simple XPath
queries involving DOMElement nodes
only, with no predicate testing and
allowing the "//" operator only as the
initial step.

You use DOMDocument::evaluate() to evaluate the expression, which then returns a DOMXPathResult.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文