读取嵌套的 XML 结构以获取值

时间:2021-07-23 07:30:41

标签: java

我正在尝试从嵌套的 xml 结构中获取值。我为它使用了多个 for 循环,但它给了我以下异常: “java.lang.NullPointerException:尝试调用从 org.w3c.dom.NodeList.item(int) 返回的空对象的方法 org.w3c.dom.Node.getTextContent() 时”

XML:

    <Testing>
        <Keys>A11</Keys>
        <Details>
            <Data>
                <FName>K</FName>
                <LName>S</LName>
            </Data>
            <Data>
                <FName>U</FName>
                <LName>C</LName>
            </Data>
        </Details>
    </Testing>

代码:


        NodeList details= doc.getElementsByTagName("Details");
        if(details != null && details.getLength() > 0)
        {
          for(int j = 0; j < details.getLength(); j++)
          {
            Element serie = (Element) details.item(j);
            NodeList data = serie.getElementsByTagName("Data");
            for(int z = 0; z < data.getLength(); z++)
            {
              NodeList LineItem = data.item(z).getChildNodes();
              if (LineItem != null && LineItem.getLength() > 0) 
              {
                for (int i = 0; i < LineItem.getLength(); i++)
                {
                  System.out.println("Data"); 
                  System.out.println("FName: " 
                    + doc.getElementsByTagName("FName").item(i).getTextContent());
                  System.out.println("LName: " 
                    + doc.getElementsByTagName("LName").item(i).getTextContent());
                }
              }
            }
          }
        }

预期输出:

    Data
    FName:K
    LName:S
    Data
    FName:U
    LName:C

2 个答案:

答案 0 :(得分:0)

问题是您试图从 doc 而不是从 LineItem 中提取 FName 和 LName。

答案 1 :(得分:0)

第一个问题:

NodeList LineItem = data.item(z).getChildNodes();
if (LineItem != null && LineItem.getLength() > 0) {
    for (int i = 0; i < LineItem.getLength(); i++) {
        System.out.println("Data");
        System.out.println("FName: " + doc.getElementsByTagName("FName").item(i).getTextContent());
        System.out.println("LName: " + doc.getElementsByTagName("LName").item(i).getTextContent());
    }
}

您已经选择了 <Data> 节点,因此您不需要拥有 getAllChildNodes 并再次迭代它们以将它们声明为元素。最重要的是,您正在从 "FName" 中提取 "Lname"doc,而不是 LineItem,并且相应的项目编号正在迭代。

但是,您可以简单地执行以下操作而不是我上面提到的块:

Node node = data.item(k);
if (node.getNodeType() == Node.ELEMENT_NODE) {
    Element element = (Element) node;
    System.out.println("Data");
    System.out.println("FName: " + element.getElementsByTagName("FName").item(0).getTextContent());
    System.out.println("LName: " + element.getElementsByTagName("LName").item(0).getTextContent());
}

这将完成您的工作。

第二个问题:

您的 xml 文件有错误的标签 <Fname>in the second. Which will, anyways lead to the NullPointerException. So please correct the tags to and`