我累了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