我累了DOMDocument ::評估xercesc 3.1.1從DOM樹中選擇節點。它適用於某些xpath表達式。但是不支持通過「// Project [@index = \」1 \「]」等屬性值來選擇節點。任何人都可以確認嗎?Xercesc XPath功能
謝謝!
我累了DOMDocument ::評估xercesc 3.1.1從DOM樹中選擇節點。它適用於某些xpath表達式。但是不支持通過「// Project [@index = \」1 \「]」等屬性值來選擇節點。任何人都可以確認嗎?Xercesc XPath功能
謝謝!
當我看着DOMDocument
class docs,我沒有看到evaluate()
方法。你的意思是DOMXPathEvaluator :: evaluate?
一般來說,DOMXPathEvaluator::evaluate()
是應該支持XPath(推測至少爲1.0),所以按屬性值選擇節點應該不成問題。
當你說「不支持」時,你的意思是說你嘗試了一個XPath表達式,如"//Project[@index=\"1\"]"
,它不起作用?如果是這樣,你的代碼是什麼樣的,結果是什麼?
你要求什麼ResultType?你如何使用返回的結果? (有時會返回正確的結果,但不能正確訪問。)
是的,我可以確認這種xpath expression
在xerces 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
DOMXPathEvaluator是一個接口。 DOMDocument繼承那個接口。 http://xerces.apache.org/xerces-c/apiDocs-3/classDOMDocument.html評估是在DOMDocumentImpl中實現的。是的,我嘗試了這種表達。 – SSD 2012-04-02 13:32:10
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
@SSD:抱歉我的界面混亂。由於DOMDocument應該實現DOMXPathEvaluator接口的evaluate()方法,所以我很困惑不在DOMDocument的類doc上看到evaluate()。並沒有提到DOMDocumentImpl。我猜這裏有一些我不熟悉的C#和Java之間的區別。 – LarsH 2012-04-02 17:21:57