当前位置: 首页 > 面试题库 >

使用NodeList遍历XML中的所有元素

苍宜修
2023-03-14
问题内容

我想遍历XML打印中的所有元素。我的问题是,在staff1标记之后,我一直收到空指针异常,即john 465456433 gmail1 area1 city1

这是我的Java代码,用于打印xml文件中的所有元素:

File fXmlFile = new File("file.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);

doc.getDocumentElement().normalize();

System.out.println("Root element :" + doc.getDocumentElement().getNodeName());

NodeList nList = doc.getElementsByTagName("*");

System.out.println("----------------------------");

Node n=null;
Element eElement=null;

for (int i = 0; i < nList.getLength(); i++) {           
  System.out.println(nList.getLength());     
  n= nList.item(i);                            
  System.out.println("\nCurrent Element :" + n.getNodeName());


  if (n.getNodeType() == Node.ELEMENT_NODE) {
    eElement = (Element) n.getChildNodes();
    System.out.println("\nCurrent Element :" + n.getNodeName());
    name = eElement.getElementsByTagName("name").item(i).getTextContent(); //here throws null pointer exception after printing staff1 tag
    phone = eElement.getElementsByTagName("phone").item(i).getTextContent();
    email = eElement.getElementsByTagName("email").item(i).getTextContent();
    area = eElement.getElementsByTagName("area").item(i).getTextContent();
    city = eElement.getElementsByTagName("city").item(i).getTextContent();
  }
  n.getNextSibling();
}

XML档案:

<?xml version="1.0"?>
<company>
  <staff1>
    <name>john</name>
    <phone>465456433</phone>
    <email>gmail1</email>
    <area>area1</area>
    <city>city1</city>
  </staff1>
  <staff2>
    <name>mary</name>
    <phone>4655556433</phone>
    <email>gmail2</email>
    <area>area2</area>
    <city>city2</city>
  </staff2>
  <staff3>
    <name>furvi</name>
    <phone>4655433</phone>
    <email>gmail3</email>
    <area>area3</area>
    <city>city3</city>
  </staff3>
</company>

预期产量:

john
465456433
gmail1
area1
city1
mary
4655556433
gmail2
area2
city2
furvi
4655433
gmail3
area3
city3

问题答案:
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document dom = db.parse("file.xml");
    Element docEle = dom.getDocumentElement();
    NodeList nl = docEle.getChildNodes();
    int length = nl.getLength();
    for (int i = 0; i < length; i++) {
        if (nl.item(i).getNodeType() == Node.ELEMENT_NODE) {
            Element el = (Element) nl.item(i);
            if (el.getNodeName().contains("staff")) {
                String name = el.getElementsByTagName("name").item(0).getTextContent();
                String phone = el.getElementsByTagName("phone").item(0).getTextContent();
                String email = el.getElementsByTagName("email").item(0).getTextContent();
                String area = el.getElementsByTagName("area").item(0).getTextContent();
                String city = el.getElementsByTagName("city").item(0).getTextContent();
            }
        }
    }

遍历所有子项,nl.item(i).getNodeType() == Node.ELEMENT_NODE并用于过滤出文本节点。如果XML中没有其他内容,则剩下的是人员节点。

对于资料下的每个节点(名称,电话,电子邮件,区域,城市)

 el.getElementsByTagName("name").item(0).getTextContent();

el.getElementsByTagName("name")会在“东西”下提取“名称”节点,为
.item(0)您提供第一个节点,并.getTextContent()在其中获取文本内容。

编辑: 由于我们有杰克逊,所以我将以其他方式进行。为对象定义一个pojo:

public class Staff {
    private String name;
    private String phone;
    private String email;
    private String area;
    private String city;
...getters setters
}

然后使用杰克逊:

    JsonNode root = new XmlMapper().readTree(xml.getBytes());
    ObjectMapper mapper = new ObjectMapper();
    root.forEach(node -> consume(node, mapper));



private void consume(JsonNode node, ObjectMapper mapper) {
    try {
        Staff staff = mapper.treeToValue(node, Staff.class);
        //TODO your job with staff
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
}


 类似资料:
  • 问题内容: 我需要JavaScript代码来遍历HTML元素中的填充属性。 这个ref表示我可以通过索引访问它,但是没有指定它是否受良好支持并且可以使用(跨浏览器)。 还是其他方式?(不使用任何框架,例如jQuery / Prototype) 问题答案: 这将在IE,Firefox和Chrome中运行(有人可以测试其他人吗?—谢谢@Bryan): 编辑:IE迭代有问题的DOM对象支持的 所有 属性

  • 问题内容: 我正在尝试对通过document.querySelectorAll查询的选定元素进行循环,但是如何? 例如,我使用: 输出: 我的问题是,最后此方法返回了3个额外的项目。我该怎么做呢? 问题答案: 不建议对数组和类似数组的对象使用循环-您会明白为什么。不仅可以有数字索引项,例如属性或某些方法,还可以遍历所有这些项。使用任一 要么 如果数组中的某些元素可能是虚假的(不是您的情况),则无法

  • 问题内容: 我想在Java中使用for-each循环进行迭代。我有一个for循环和一个do-while循环,但没有for-each。 问题答案: 此问题的解决方法很简单,值得庆幸的是,您只需实现一次即可。 在将此实用程序类添加到项目中并 为源代码添加方法的后,您可以像这样使用它:

  • 本文向大家介绍php遍历类中包含的所有元素的方法,包括了php遍历类中包含的所有元素的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php遍历类中包含的所有元素的方法。分享给大家供大家参考。具体分析如下: 这里可获得php类包含的所有元素以key-value的形式输出 运行结果如下: 希望本文所述对大家的php程序设计有所帮助。

  • 问题内容: 在Java中遍历所有DOM元素的最有效方法是什么? 像这样,但是对于当前的每个DOM元素呢? 问题答案: 基本上,您可以通过两种方式遍历所有元素: 1.使用递归 (我认为是最常见的方式): 2. 使用带有as参数的方法 避免递归 : 我认为这些方式都很有效。 希望这可以帮助。

  • 本文向大家介绍PHP遍历XML文档所有节点的方法,包括了PHP遍历XML文档所有节点的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP遍历XML文档所有节点的方法。分享给大家供大家参考。具体实现方法如下: 1. contact.xml代码: 2. php代码: 希望本文所述对大家的php程序设计有所帮助。