如何使用JDOM

时间:2017-04-26 06:39:04

标签: java xml 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标签的值?谢谢!!!!

2 个答案:

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