【问题标题】:Xpath, Java and variablesXpath、Java 和变量
【发布时间】:2014-01-02 14:53:15
【问题描述】:

这是我目前拥有的代码:

Document document2 = builder.parse(new FileInputStream("C:path to xml file.xml"));
Node theNode2 = (Node) xpath.evaluate("//*[@name='**variable here**']", document2, XPathConstants.NODE);

代码说“这里的变量”,是否可以使用变量搜索 XML 文件?到目前为止,我只能硬编码我正在寻找的东西,即:

("//*[@name='happy']", document2, XPathConstants.NODE);

【问题讨论】:

    标签: java xml xpath


    【解决方案1】:

    您需要创建XPathVariableResolver 的实例并将其附加到您的XPath 实例。遗憾的是,默认情况下没有提供此接口的标准实现,但它只包含一个方法,因此很容易实现自己:

    final Map<String, Object> variables = new HashMap<String, Object>();
    XPathVariableResolver varResolver = new XPathVariableResolver() {
      public Object resolveVariable(QName name) {
        // for simplicity, ignore namespaces
        return variables.get(name.getLocalPart());
      }
    };
    xpath.setXPathVariableResolver(varResolver);
    

    有了这个,您现在可以创建变量绑定并使用$var 语法在 XPath 中引用它们:

    variables.put("theName", "happy");
    Node theNode2 = (Node) xpath.evaluate("//*[@name=$theName]", document2, XPathConstants.NODE);
    

    这比尝试通过将不同的字符串连接在一起来构建 XPath 表达式要安全得多,特别是如果您要用于 theName 的值来自不受信任的来源(这是 XPath 等效的 SQL 注入漏洞) .

    对于 XPath,还有一个额外的复杂情况是,虽然您可以用单引号或双引号分隔字符串文字,但没有转义机制,因此在 XPath 中不可能有一个包含单引号和双引号字符的单个字符串文字 (你必须使用像concat('"', "'")这样的解决方法。变量解析器的方法可以处理这种情况没问题:

    variables.put("theName", "John \"The Boss\" O'Brien"); // escape " from Java
    Node theNode2 = (Node) xpath.evaluate("//*[@name=$theName]", document2, XPathConstants.NODE);
    

    此外,现在实际的 XPath 表达式是一个常量,您可以编译一次,然后根据需要针对不同的变量值执行多次,而不是每次都重新编译:

    XPathExpression expr = xpath.compile("//*[@name=$theName]");
    // look for @name='name 1'
    variables.put("theName", "name 1");
    Node node1 = expr.evaluate(document2, XPathConstants.NODE);
    // look for @name='name 2' in the same document
    variables.put("theName", "name 2");
    Node node2 = expr.evaluate(document2, XPathConstants.NODE);
    

    【讨论】:

      【解决方案2】:

      你的问题不是很清楚,但我认为你想要做的是搜索一些东西,而不是硬编码这个变量名?

      String variable = "variable name";
      Document document2 = builder.parse(new FileInputStream("C:path to xml file.xml"));
          Node theNode2 = (Node) xpath.evaluate("//*[@name='" + variable+"']", document2, XPathConstants.NODE);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-23
        • 1970-01-01
        • 2011-12-19
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        • 2019-10-08
        相关资源
        最近更新 更多