使用Xpath从xml代码中获取最大ID

时间:2014-04-08 20:52:46

标签: java xml xpath

我有一个XML文件,其中包含两个元素:ProjectLayer。我希望使用java获得具有最高编号的属性idLayer。我的代码无法正常运行:

public int GetMaxID() throws JAXBException {
    try {
        XPathFactory xPathFactory = XPathFactory.newInstance();
        XPath xPath = xPathFactory.newXPath();
        String expression = "//Project/Layer/@idLayer[not(. <=../preceding-sibling::Layer/@idLayer) and not(. <=../following-sibling::Layer/@idLayer)]";
        XPathExpression xPathExpression = xPath.compile(expression);
        InputSource doc = newInputSource(newInputStreamReader(newFileInputStream(newFile("Projects//asdad//ProjectDataBase.xml"))));
        NodeList elem1List = (NodeList) xPathExpression.evaluate(doc, XPathConstants.NODESET);
        int maxId = elem1List.getLength();//give me 0
    } catch (Exception e) {
        e.printStackTrace();
    }
    return -1;
}  

我的XML代码:

<tns:Project xmlns:tns="http://www.example.org/ProjectDataBase" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/ProjectDataBase ProjectDataBase.xsd ">
  <tns:Layer idLayer="1">
    <tns:LayerName>tns:LayerName1</tns:LayerName> 
  </tns:Layer>
  <tns:Layer idLayer="2">
    <tns:LayerName>tns:LayerName2</tns:LayerName> 
  </tns:Layer>
  <tns:Layer idLayer="3">
    <tns:LayerName>tns:LayerName3</tns:LayerName> 
  </tns:Layer>
 </tns:Project>

你能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

您的问题是tns命名空间。您不在XPath表达式中使用它,因此它无法选择任何内容。

有无数关于如何使用JDOM注册XML名称空间的示例,例如this one

另外,你的XPath太复杂了。

使用//tns:Project/tns:Layer[not(@idLayer < ../tns:Layer/@idLayer)]/@idLayer

请注意,这不会给 最大节点,但所有最大节点 - 可能会有多个节点。