可以反复使用XPath来缩小结果范围吗?

时间:2014-09-30 01:09:27

标签: xml excel-vba xpath vba excel

假设我需要根据多个标准(书的标题,书的主题,书的作者,书的价格......)选择节点列表,每个标准可能涉及选择多个值中的任何一个(主题是泰国,金融,历史之一;作者是Bob,Ted,Carol,Alice)之一

生成的XPath查询可能很长,而且语法相当复杂。可以进行初始查询(例如,仅考虑主题),生成节点列表,然后应用第二个XPath查询,以将节点列表缩短为更短,而不是在单个传递中执行查询列出?

在我看来答案是否定的,因为selectNodes方法不能应用于初始结果的IXMLDOMNodeList对象。我错过了什么吗?有没有办法做到这一点?

[问题的背景是:向用户呈现表单,以选择报告生成器的标准。用户可以选择具有不同细节程度的一个或多个标准。 将所有选定的标准组合到单个XPath查询中变得相当繁琐,特别是因为不同的标准出现在树的不同级别。]

如果可能,迭代应用标准将大大降低复杂性。

1 个答案:

答案 0 :(得分:0)

XPath查询可以应用于单个IXMLDOMNode,以使用该节点作为起点获取新的节点列表,但正如您所发现的,您无法直接将XPath应用于IXMLNDOMNodeList。

解决这个问题的方法之一是:

  1. 执行XPath查询
  2. 将下一个XPath步骤应用于每个结果
  3. 将步骤2中的所有结果合并为一组(确保清除重复项)
  4. 从第2步继续
  5. 然而,这可能会变得非常低效。

    我认为har07建议使用字符串构建XPath是一个非常好的建议。没有理由比你想做的更复杂。您可以简单地一步一步,并为每个过滤器使用单独的谓词。

    从你的主路径开始(在这里使用伪代码而不是实际的VBA):

    string path = "/my/node/path"
    

    然后逐个添加过滤器:

    if (filtering by author) {
        path += "[author = 'Bob' or author = 'Ted']" // <- build this up dynamically
    }
    if (filtering by subject) {
        path += "[subject = 'Thailand' or subject = 'Finance']"
    }
    
    IXMLDOMNodeList nodes = document.selectNodes(path)