我支持使用Xerces-C進行XML解析的傳統C++應用程序。我被.Net所寵壞,習慣於使用XPath從DOM樹中選擇節點。Xerces-C中的XPath支持
有沒有辦法在Xerces-C中訪問某些有限的XPath功能?我正在尋找像selectNodes(「/ for/bar/baz」)。我可以手動執行此操作,但通過比較,XPath非常好。
我支持使用Xerces-C進行XML解析的傳統C++應用程序。我被.Net所寵壞,習慣於使用XPath從DOM樹中選擇節點。Xerces-C中的XPath支持
有沒有辦法在Xerces-C中訪問某些有限的XPath功能?我正在尋找像selectNodes(「/ for/bar/baz」)。我可以手動執行此操作,但通過比較,XPath非常好。
查看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僅用於處理Schema標識約束的部分XPath實現。要獲得完整的XPath支持,可以參考Apache Xalan C++或其他開源項目,如Pathan。
然而,使用xalan來做你想做的事情是相當容易的。
按照FAQ,的Xerces-C支持部分的XPath 1個實施:
相同的發動機通過DOM文檔提供 ::評價API 讓用戶執行涉及一個DOMElement簡單的XPath查詢 只有節點 ,沒有謂詞測試,而 只允許「//」運算符作爲 的初始步驟。
您使用DOMDocument::evaluate()來評估表達式,然後返回DOMXPathResult。
以下是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
有沒有人使用這個功能?它有效嗎?如果是這樣,那麼對於Xerces-C的哪些版本? – 2009-07-09 20:35:44