【问题标题】:Xercesc XPath functionalitiesXercesc XPath 功能
【发布时间】:2012-04-02 00:35:50
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: c++ dom xpath xerces-c


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      当我查看DOMDocument class docs 时,我没有看到evaluate() 方法。你是说 DOMXPathEvaluator::evaluate 吗?

      一般来说DOMXPathEvaluator::evaluate()应该支持XPath(大概至少1.0),所以按属性值选择节点应该不成问题。

      当您说“不支持”时,您的意思是您尝试了像 "//Project[@index=\"1\"]" 这样的 XPath 表达式但它不起作用?如果是这样,您的代码是什么样的,结果如何?

      您要求的 ResultType 是什么?您如何使用返回的结果? (有时会返回正确的结果,但无法正确访问。)

      【讨论】:

      • DOMXPathEvaluator 是一个接口。 DOMDocument 继承了该接口。 xerces.apache.org/xerces-c/apiDocs-3/classDOMDocument.html evaluate 在 DOMDocumentImpl 中实现。是的,我试过那个表达方式。
      • DOMXPathEvaluator 是一个接口。 DOMDocument 继承了该接口。评估在 DOMDocumentImpl 中实现。是的,我试过那个表达。 DOMNode* node = parser->getDocument(); DOMDocument* 文档 = dynamic_cast(node); DOMElement* root = 文档->getDocumentElement();尝试 { DOMXPathNSResolver* resolver=document->createNSResolver(root); DOMXPathResult* result=document->evaluate(xpathStr, root, resolver, DOMXPathResult::ORDERED_NODE_SNAPSHOT_TYPE, NULL);该表达式触发了异常。
      • @SSD:很抱歉我对界面的困惑。由于 DOMDocument 应该实现 DOMXPathEvaluator 接口的 evaluate() 方法,我很困惑没有在 DOMDocument 的类文档上看到 evaluate()。并且没有提到 DOMDocumentImpl。我猜这里 C# 和 Java 之间有一些我不熟悉的区别。
      • @SSD,关于您的代码,请编辑问题以在此处发布您的代码 (sssce.org)。评论中的格式让人很难阅读。谢谢。另外请告诉我们发生了什么异常。
      • 我也遇到了同样的问题,我发现 xerces 在解析 '[' 时会抛出 Token Not Found 异常。你有任何关于这个问题的消息吗?
      猜你喜欢
      • 2015-11-25
      • 2011-02-12
      • 2018-09-08
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多