2013-09-27 71 views
0

我需要做2件事。从一般xpath获取精确的xpath

  1. 验证XML文件中节点的值。
  2. 如果值对应,我需要更改它。

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

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

这发生n次在每个XMLFILE我要解析。这很容易

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

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

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

我已经做了几个testHere是一个虚拟的XML,我找

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

我的Xpath上的表达是//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 将不尝试生成正确的Xpath

+0

为什么不使用''staticTag [@ property ='id']“',没有前导'/'? - 最顶端的标记不匹配,因为它没有该属性。 – gaborsch

+0

我有这个模式N次。在同一个XML文件中。而且我不需要更改所有这些N实例。只要该值与内存中的另一个匹配即可。 – drgn

+0

我想你需要赶上带有属性的中间''(我想没有其他的节点具有'property =“id”'属性) - 你能做到吗?我们没有你的XML信息。 – gaborsch

回答

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,所以我正在使用的另一个对象现在可以读取/替换该值。问题解决了。