如何使用 JDOM 从 XML 中获取属性值的值
How to get the value of attribute value from XML using JDOM
<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标签的值?谢谢!!!!
你得到 NullPointerException
因为你试图得到不存在的子对象的子对象:
表演时
Element subsubRootNode = subRootNode.getChild("ns2:DataItem");
return 值是不包含 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();
}
}
要访问 JDOM 中命名空间中的元素,您应该使用方法 getChild(localName, namespaceUri)
。
例如,如果元素是
<ns:donald xmlns:ns="http://us.nepotism.com/">
<ns:ivanka/>
</ns:donald>
那么你应该使用getChild("ivanka", "http://us.nepotism.com/")
@GalDraiman 的回答似乎完全忽略了命名空间问题。
<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标签的值?谢谢!!!!
你得到 NullPointerException
因为你试图得到不存在的子对象的子对象:
表演时
Element subsubRootNode = subRootNode.getChild("ns2:DataItem");
return 值是不包含 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();
}
}
要访问 JDOM 中命名空间中的元素,您应该使用方法 getChild(localName, namespaceUri)
。
例如,如果元素是
<ns:donald xmlns:ns="http://us.nepotism.com/">
<ns:ivanka/>
</ns:donald>
那么你应该使用getChild("ivanka", "http://us.nepotism.com/")
@GalDraiman 的回答似乎完全忽略了命名空间问题。