<ns2:VehicleStatusReport>
<ns2:DataContent>
<ns2:DataItem>
<ns2:Name>star</ns2:Name>
<ns2:Percent>65.6</ns2:Percent>
<ns2:Source>egg</ns2:Source>
</ns2:DataItem>
<ns2:DataItem>
<ns2:Name>position</ns2:Name>
<ns2:Position>
<ns3:RandomNumbers>8.378137,8.36</ns3:RandomNumbers>
<ns3:Integer>124.9,124.999901</ns3:Integer>
<ns3:Heading>0</ns3:Heading>
</ns2:Position>
</ns2:DataItem>
上面是我尝试使用JDOM在java中解析的示例XML,以下是我的代码。
String xml="above xml";
org.jdom.Document doc = saxBuilder.build(new StringReader(xml));
Element rootNode = doc.getRootElement();
Element subRootNode = rootNode.getChild("ns2:DataContent");
Element subsubRootNode = subRootNode.getChild("ns2:DataItem");
Element subsubsubRootNode = subsubRootNode.getChild("ns2:Position");
String value=subsubsubRootNode.getAttributeValue("ns3:RandomNumbers");
System.out.println(value);
但是当我执行上面的代码时,我会在后面的行中获得NULLPOINTEREXCEPTION
Element subsubRootNode = subRootNode.getChild("ns2:DataItem");
如何获取RandomNumbers和Interger xml标签的值?谢谢!!!!
答案 0 :(得分:-1)
你得到NullPointerException
,因为你试图得到一个不存在的子对象的孩子:
执行时
Element subsubRootNode = subRootNode.getChild("ns2:DataItem");
返回值是第一个不包含ns2:Position
的节点,而不是您示例中的另一个ns2:DataItem
。
无论如何,我建议使用getChildren
代替getChild
的简单解决方案,当您拥有具有相同属性的多个节点的列表时:
String xml="above xml";
org.jdom.Document doc = saxBuilder.build(new StringReader(xml));
Element rootNode = doc.getRootElement();
List dataItemsList = rootNode.getChildren("ns2:DataContent");
for ( int i = 0; i < dataItemsList.size(); i++ ) {
Element dataItem = (Element) dataItemsList.get(i);
Element position = subsubRootNode.getChild("ns2:Position");
if(position != null){
String value=subsubsubRootNode.getAttributeValue("ns3:RandomNumbers");
System.out.println(value);
}
}
String xml = "<VehicleStatusReport>" +
"<DataContent>" +
"<DataItem>" +
"<Name>star</Name>" +
"<Percent>65.6</Percent>" +
"<Source>egg</Source>" +
"</DataItem>" +
"<DataItem>" +
"<Name>position</Name>" +
"<Position>" +
"<RandomNumbers>8.378137,8.36</RandomNumbers>" +
"<Integer>124.9,124.999901</Integer>" +
"<Heading>0</Heading>" +
"</Position>" +
"</DataItem>" +
"</DataContent>" +
"</VehicleStatusReport>";
SAXBuilder saxBuilder = new SAXBuilder();
Document doc;
try {
doc = saxBuilder.build(new StringReader(xml));
Element rootNode = doc.getRootElement();
Element dataContent = rootNode.getChild("DataContent");
List dataItemsList = dataContent.getChildren();
for (int i = 0; i < dataItemsList.size(); i++) {
Element dataItem = (Element) dataItemsList.get(i);
Element position = dataItem.getChild("Position");
if (position != null) {
Element randomNumbers = position.getChild("RandomNumbers");
List value = randomNumbers.getContent();
System.out.println(value.get(0));
}
}
} catch (JDOMException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
答案 1 :(得分:-1)
要访问JDOM中命名空间中的元素,您应该使用方法getChild(localName, namespaceUri)
。
例如,如果元素是
<ns:donald xmlns:ns="http://us.nepotism.com/">
<ns:ivanka/>
</ns:donald>
然后你应该使用getChild("ivanka", "http://us.nepotism.com/")
来自@GalDraiman的答案似乎完全忽略了命名空间问题。