0

我需要做两件事。

  1. 验证 XML 文件中节点的值。

  2. 如果值对应,我需要更改它。

    我已经有一个复杂的对象层次结构来完成这项工作。现在我面临一个有问题的案例。让我们看一个例子:

    <staticTag>
      <randomTag>
        <anotherRandomTag>  
          <staticTag property="id">
             <staticTag> VALUE </staticTag>
          </staticTag>  
        </anotherRandomTag>  
      </randomTag>  
    </staticTag>
    

这在我必须解析的每个 XMLFile 中都发生了 n 次。这很容易

//staticTag[@property='id']/staticTag/text()

是的,它将返回给我我需要验证的所有值。问题是我没有精确的 xpath 来更改值,如果它对应于我正在寻找的值。

如有必要,我可能会发布代码示例。所以tl; dr:有没有办法从一般的xpath生成精确的xpath?像往常一样感谢您的宝贵时间。

我已经做了一些测试这里是一个虚拟 xml

<tag>
   <ZDSJG>
      <SJROT>X66P1</SJROT>
   </ZDSJG>
   <DNLVZ>
      <SJROT>VV1EZ</SJROT>
   </DNLVZ>
</tag>

我正在寻找的 Xpath xpression 是//SJROT 使用我编写的函数,我可以从第一个节点生成这个 XPATH:/#document/tag/ZDSJG/SJROT/#text

不幸的是,xpath 表达式//SJROT没有返回具有此名称的第二个节点。这里有一段代码用于查找提供的 Xpath 表达式

    XPathExpression expression = xpath.compile(expressionXPath);

    NodeList result = (NodeList) expression.evaluate(document, XPathConstants.NODE);

    List<String> generatedXpath = Lists.newArrayList();
    for (int i = 0; i < result.getLength(); i++) {
        generatedXpath.add(getXPath(result.item(i)));
    }
    return generatedXpath;

另一个编辑:我修复了我的代码,我不得不使用NODESET而不是NODE Will no try to generate the proper Xpath

4

1 回答 1

0

因为我没有找到任何可以从节点生成 XPath 的东西。我做了我自己的。这是非常基本的,可以在很多方面进行改进。但目前它符合我的需求。如果有人有更好的解决方案,我很乐意接受。这是我的 java 代码:随时改进

    public List<String> generateAbsoluteXpath(File fileToRead, String expressionXPath) throws Exception {
    DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();
    Document document = documentFactory.newDocumentBuilder().parse(fileToRead);

    XPathFactory xpathFactory = XPathFactory.newInstance();
    XPath xpath = xpathFactory.newXPath();

    XPathExpression expression = xpath.compile(expressionXPath);
    NodeList result = (NodeList) expression.evaluate(document, XPathConstants.NODESET);

    List<String> generatedXpath = Lists.newArrayList();
    for (int i = 0; i < result.getLength(); i++) {
        generatedXpath.add(getXPath(result.item(i)));
    }
    return generatedXpath;
}



public String getXPath(Node node)
{
    Node parent = node.getParentNode();
    if (parent == null || parent.getNodeName().equals("#document")) {
        return "/" + node.getNodeName();
    }
    return getXPath(parent) + "/" + node.getNodeName();
}

所以基本上,我输入了一个将生成多个节点的 XPath。它返回了绝对 xpath 的列表,该列表引用了使用一般路径找到的节点。由于我拥有绝对 xpath,因此我正在使用的其他对象现在可以读取/替换该值。问题解决了。

于 2013-09-30T17:45:08.063 回答