2009-07-09 62 views
6

我支持使用Xerces-C進行XML解析的傳統C++應用程序。我被.Net所寵壞,習慣於使用XPath從DOM樹中選擇節點。Xerces-C中的XPath支持

有沒有辦法在Xerces-C中訪問某些有限的XPath功能?我正在尋找像selectNodes(「/ for/bar/baz」)。我可以手動執行此操作,但通過比較,XPath非常好。

回答

4

查看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來做你想做的事情是相當容易的。

1

按照FAQ,的Xerces-C支持部分的XPath 1個實施:

相同的發動機通過DOM文檔提供 ::評價API 讓用戶執行涉及一個DOMElement簡單的XPath查詢 只有節點 ,沒有謂詞測試,而 只允許「//」運算符作爲 的初始步驟。

您使用DOMDocument::evaluate()來評估表達式,然後返回DOMXPathResult

+0

有沒有人使用這個功能?它有效嗎?如果是這樣,那麼對於Xerces-C的哪些版本? – 2009-07-09 20:35:44

1

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