2012-04-02 99 views
1

我累了DOMDocument ::評估xercesc 3.1.1從DOM樹中選擇節點。它適用於某些xpath表達式。但是不支持通過「// Project [@index = \」1 \「]」等屬性值來選擇節點。任何人都可以確認嗎?Xercesc XPath功能

謝謝!

回答

0

當我看着DOMDocumentclass docs,我沒有看到evaluate()方法。你的意思是DOMXPathEvaluator :: evaluate?

一般來說,DOMXPathEvaluator::evaluate()應該支持XPath(推測至少爲1.0),所以按屬性值選擇節點應該不成問題。

當你說「不支持」時,你的意思是說你嘗試了一個XPath表達式,如"//Project[@index=\"1\"]",它不起作用?如果是這樣,你的代碼是什麼樣的,結果是什麼?

你要求什麼ResultType?你如何使用返回的結果? (有時會返回正確的結果,但不能正確訪問。)

+1

DOMXPathEvaluator是一個接口。 DOMDocument繼承那個接口。 http://xerces.apache.org/xerces-c/apiDocs-3/classDOMDocument.html評估是在DOMDocumentImpl中實現的。是的,我嘗試了這種表達。 – SSD 2012-04-02 13:32:10

+0

DOMXPathEvaluator是一個接口。 DOMDocument繼承那個接口。評估是在DOMDocumentImpl中實現的。是的,我嘗試了這種表達。 DOMNode * node = parser-> getDocument(); DOMDocument * document = dynamic_cast (node); DOMElement * root = document-> getDocumentElement();嘗試 DOMXPathNSResolver * resolver = document-> createNSResolver(root); DOMXPathResult * result = document-> evaluate( xpathStr,root,resolver,DOMXPathResult :: ORDERED_NODE_SNAPSHOT_TYPE,NULL);該表達式引發了異常。 – SSD 2012-04-02 13:41:27

+0

@SSD:抱歉我的界面混亂。由於DOMDocument應該實現DOMXPathEvaluator接口的evaluate()方法,所以我很困惑不在DOMDocument的類doc上看到evaluate()。並沒有提到DOMDocumentImpl。我猜這裏有一些我不熟悉的C#和Java之間的區別。 – LarsH 2012-04-02 17:21:57

1

是的,我可以確認這種xpath expressionxerces 3.1.1中不受支持。

作爲一個例子,讓我們說你XML看起來像......

<Root><Item>ABCD</Item><Item>EFGH</Item></Root> 

...然後將以下代碼打印出Item節點的值:

DOMElement * lXMLDocumentElement(lXMLDocument->getDocumentElement()); 
if (lXMLDocumentElement) 
{ 
    try 
    { 
    DOMXPathResult * r(
     lXMLDocument->evaluate(L"Item", lXMLDocumentElement, NULL, DOMXPathResult::ORDERED_NODE_SNAPSHOT_TYPE, NULL)); 

    if (r) 
    { 
     for (unsigned c(0); c < r->getSnapshotLength(); ++c) 
     { 
     r->snapshotItem(c); 
     DOMNode * n(r->getNodeValue()); 

     if (n->getNodeType() == DOMNode::ELEMENT_NODE) 
     { 
      DOMElement * e(static_cast<DOMElement *>(n)); 

      std::wcout << e->getTextContent() << std::endl; 
     } 
     } 
    } 
    } 
    catch (const DOMXPathException & e) 
    { 
    // handle exception 
    } 
} 

然而,當, XML看起來像

<Root><Project index="1">ABCD</Project><Project>EFGH</Project></Root> 

和所述xpath expression

//Project[@index="1"] 

被使用,與代碼INVALID_EXPRESSION_ERR則拋出異常,從而不支持的表達。

其還值得一提的是,evaluate()方法僅支持參數type以下值(見DOMXPathResultImpl.cpp

ANY_UNORDERED_NODE_TYPE 
FIRST_ORDERED_NODE_TYPE 
UNORDERED_NODE_SNAPSHOT_TYPE 
ORDERED_NODE_SNAPSHOT_TYPE