Xercesc XPath功能

时间:2012-04-02 00:35:51

标签: c++ dom xpath xerces-c

我已经厌倦了xercesc 3.1.1中的DOMDocument :: evaluate来从DOM树中选择节点。它适用于某些xpath表达式。但是不支持按属性值选择节点,如“// Project [@index = \”1 \“]”。谁能证实这一点?

谢谢!

2 个答案:

答案 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?你是如何使用返回的结果的? (有时会返回正确的结果,但无法正确访问它们。)