检索不同的子元素xml

时间:2014-08-25 17:24:43

标签: java xml dom

我有一个看起来像这样的xml文件。

<Device>
<Staff>
<Name>ABC</Name>
<Name>Hello</Name>
</Staff>
<Connect>
<Speed>123</Speed>
<Speed>456</Speed>
</Connect>
</Device>

我需要帮助来检索name&amp;的值速度,因为我以前从未尝试过xml。每当我尝试检索元素值时,我都会得到空指针异常。任何帮助表示赞赏。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = factory.newDocumentBuilder();

      // Load the input XML document, parse it and return an instance of the
      // Document class.
      Document document = builder.parse(new File("C:/Users/AA/Desktop/eclipse/lol/testing.xml"));//change to own directory


      NodeList nodeList = document.getDocumentElement().getChildNodes();
      System.out.println(nodeList.getLength());
     for (int i = 0; i < nodeList.getLength(); i++) {
           Node node = nodeList.item(i);

           if (node.getNodeType() == Node.ELEMENT_NODE) {
               System.out.println(i);
                Element elem = (Element) node;

                // Get the value of the ID attribute.
             //   String ID = node.getAttributes().getNamedItem("ID").getNodeValue();

                // Get the value of all sub-elements.
                String name = elem.getElementsByTagName("Name")
                                    .item(0).getChildNodes().item(0).getNodeValue();

               Integer speed = Integer.parseInt(elem.getElementsByTagName("Connect")
                        .item(0).getChildNodes().item(0).getNodeValue());//null pointer exception happens here

                staffList.add(new staff(name));
                connectList.add(new connect(speed));
           }
      }

      // Print all employees.
      for (staff stl : staffList)
           {System.out.println("STAFF "+stl.getName());}
      for (connect ctl : connectList)
      {System.out.println("Connect "+ctl.getSpeed());}

2 个答案:

答案 0 :(得分:2)

您将拥有空指针异常,因为您假设在 for循环的每个迭代中,所需节点具有子元素:

String name = elem.getElementsByTagName("Name")
                                .item(0).getChildNodes().item(0).getNodeValue();

在上面的代码中,您正在访问作为文本节点的Name元素的第一个子节点(例如ABC),然后然后获取其子节点,这将导致异常,因为文本节点中没有子元素。

同样地,

Integer speed = Integer.parseInt(elem.getElementsByTagName("Connect")
                    .item(0).getChildNodes().item(0).getNodeValue());

会在elem对应Connect本身的循环迭代之一中导致异常。

您可以尝试使用以下代码:

if (node.getNodeType() == Node.ELEMENT_NODE) {
    System.out.println(i);
    Element elem = (Element) node;

    // Get the value of the ID attribute.
    // String ID =
    // node.getAttributes().getNamedItem("ID").getNodeValue();

    // Get the value of all sub-elements.
    NodeList nameNodes = elem.getElementsByTagName("Name");
    for(int j = 0; j < nameNodes.getLength(); j++) {
        Node nameNode = nameNodes.item(j);
        staffList.add(new staff(nameNode.getTextContent()));
    }

    NodeList speedNodes = elem.getElementsByTagName("Speed");
    for(int j = 0; j < speedNodes.getLength(); j++) {
        Node speedNode = speedNodes.item(j);
        connectList.add(new connect(Integer.parseInt(speedNode.getTextContent())));
    }
}

P.S。:尝试使用以大写字母开头的类名。

答案 1 :(得分:0)

你想要getTextContent()而不是getNodeValue() - 后者总是为元素节点返回null。 请参阅:DOMDocument getNodeValue() returns null (contains an output escaped string)