2013-01-07 117 views
2

我找不到很多使用xerces-c 3.1評估XPath的例子。xerces-c 3.1 XPath評估

鑑於下面的示例XML輸入:

<abc> 
    <def>AAA BBB CCC</def> 
</abc> 

我需要的XPath來檢索 「AAA BBB CCC」 字符串 「/ ABC/DEF /文本()[0]」。

下面的代碼工作:

XMLPlatformUtils::Initialize(); 
// create the DOM parser 
XercesDOMParser *parser = new XercesDOMParser; 
parser->setValidationScheme(XercesDOMParser::Val_Never); 
parser->parse("test.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("/abc/def"), // "/abc/def/text()[0]" 
    root, 
    NULL, 
    DOMXPathResult::ORDERED_NODE_SNAPSHOT_TYPE, //DOMXPathResult::ANY_UNORDERED_NODE_TYPE, //DOMXPathResult::STRING_TYPE, 
    NULL); 

// look into the xpart evaluate result 
result->snapshotItem(0); 
std::cout<<StrX(result->getNodeValue()->getFirstChild()->getNodeValue())<<std::endl;; 

XMLPlatformUtils::Terminate(); 
return 0; 

但我真的恨:

result->getNodeValue()->getFirstChild()->getNodeValue() 

有它被一個節點設置我想確切的節點呢?

我嘗試了其他格式的XPath,例如「/ abc/def/text()[0]」和「DOMXPathResult :: STRING_TYPE」。 xerces總是拋出異常。

我做錯了什麼?

回答

3

我不使用Xerces的C編寫++,但它似乎很基礎上,我會建議選擇具有像路徑元素節點來實現W3C DOM Level 3和然後簡單地訪問result->getNodeValue()->getTextContent()得到的內容元素(例如AAA BBB CCC)。

據我瞭解的DOM API,如果你想要一個字符串值,那麼你需要使用像string(/abc/def)的路徑,然後result->getStringValue()應該做的(如果evaluate方法請求任何類型或STRING_TYPE的結果類型)。

其他方法如果您知道您只對文檔順序中的第一個節點感興趣,則可以使用FIRST_ORDERED_NODE_TYPE評估,然後訪問result->getNodeValue()->getTextContent()

+1

result-> getStringValue()總是拋出,無論TYPE傳遞給evaluate()。 result-> getNodeValue() - > getTextContent()的作品。謝謝 –

+0

使XPath能夠使result-> getStringValue()起作用是非常好的。任何人都知道如何? –

+0

@JohnCrane有沒有辦法知道文檔是否屬於解析器? 你可以請看看這個問題.. http://stackoverflow.com/questions/23673300/how-to-know-if-a-domdocument-is-created-using-a-parser – Pavan