如何使用 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 的回答似乎完全忽略了命名空间问题。