我有一个XML文件,其中包含两个元素:Project
和Layer
。我希望使用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>
你能指出我正确的方向吗?
答案 0 :(得分:0)
您的问题是tns
命名空间。您不在XPath表达式中使用它,因此它无法选择任何内容。
有无数关于如何使用JDOM注册XML名称空间的示例,例如this one。
另外,你的XPath太复杂了。
使用//tns:Project/tns:Layer[not(@idLayer < ../tns:Layer/@idLayer)]/@idLayer
。
请注意,这不会给 最大节点,但所有最大节点 - 可能会有多个节点。