我已经厌倦了xercesc 3.1.1中的DOMDocument :: evaluate来从DOM树中选择节点。它适用于某些xpath表达式。但是不支持按属性值选择节点,如“// Project [@index = \”1 \“]”。谁能证实这一点?
谢谢!
答案 0 :(得分:1)
是的,我可以确认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
答案 1 :(得分:0)
当我查看DOMDocument
class docs时,我看不到evaluate()
方法。你的意思是DOMXPathEvaluator :: evaluate?
通常,DOMXPathEvaluator::evaluate()
应该支持XPath(大概至少为1.0),因此按属性值选择节点应该不是问题。
当你说“不支持”时,你的意思是你尝试了像"//Project[@index=\"1\"]"
这样的XPath表达式并且它不起作用吗?如果是这样,你的代码是什么样的,结果是什么?
你要求什么ResultType?你是如何使用返回的结果的? (有时会返回正确的结果,但无法正确访问它们。)