【发布时间】:2012-04-02 00:35:50
【问题描述】:
我已经厌倦了 DOMDocument::evaluate 在 xercesc 3.1.1 中从 DOM 树中选择节点。它适用于某些 xpath 表达式。但不支持按属性值选择节点,如 "//Project[@index=\"1\"]"。谁能证实这一点?
谢谢!
【问题讨论】:
我已经厌倦了 DOMDocument::evaluate 在 xercesc 3.1.1 中从 DOM 树中选择节点。它适用于某些 xpath 表达式。但不支持按属性值选择节点,如 "//Project[@index=\"1\"]"。谁能证实这一点?
谢谢!
【问题讨论】:
是的,我可以确认xerces 3.1.1 不支持这种xpath expression。
例如,假设您的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
【讨论】:
当我查看DOMDocument class docs 时,我没有看到evaluate() 方法。你是说 DOMXPathEvaluator::evaluate 吗?
一般来说DOMXPathEvaluator::evaluate()是应该支持XPath(大概至少1.0),所以按属性值选择节点应该不成问题。
当您说“不支持”时,您的意思是您尝试了像 "//Project[@index=\"1\"]" 这样的 XPath 表达式但它不起作用?如果是这样,您的代码是什么样的,结果如何?
您要求的 ResultType 是什么?您如何使用返回的结果? (有时会返回正确的结果,但无法正确访问。)
【讨论】: