11

XML解析にXerces-Cを使用するレガシーC++アプリケーションをサポートしています。私は.Netに甘やかされており、XPathを使用してDOMツリーからノードを選択することに慣れています。

Xerces-Cの制限されたXPath機能にアクセスする方法はありますか?selectNodes( "/ for / bar / baz")のようなものを探しています。これは手動で行うこともできますが、XPathは比較すると非常に優れています。

4

3 に答える 3

7

xerces faq を参照してください。

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 には、スキーマ ID 制約を処理する目的で部分的な XPath 実装しかありません。完全な XPath サポートについては、Apache Xalan C++ または Pathan などの他のオープン ソース プロジェクトを参照できます。

ただし、xalan を使用してやりたいことを行うのはかなり簡単です。

于 2009-07-09T23:59:40.787 に答える
5

以下は、 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
于 2015-10-14T18:20:47.933 に答える
1

FAQによると、Xerces-C は部分的な XPath 1 実装をサポートしています。

同じエンジンが DOMDocument::evaluate API を通じて利用可能になり、ユーザーは DOMElement ノードのみを含む単純な XPath クエリを実行できます。述語のテストは行われず、"//" 演算子は最初のステップとしてのみ許可されます。

DOMDocument::evaluate()を使用して式を評価すると、DOMXPathResultが返されます。

于 2009-07-09T19:59:03.470 に答える