如何修改Java代码读取XML文件中的所有Customer节点
解决XML DOM读取所有Customer节点的问题
嘿,我一眼就瞅出问题所在啦!你当前的代码只抓取了第一个<Customer>节点,完全没遍历所有的Customer元素。咱们调整下代码逻辑,就能轻松读取任意数量的Customer记录了。
先确认你的XML内容:
<Customers> <Customer Name="Test_91" Code="91" Purpose="Supplier" /> <Customer Name="Test_92" Code="92" Purpose="Receiver" /> </Customers>
原代码的问题分析
你原来的代码里,doc.getElementsByTagName("Customers")获取的是根节点<Customers>的列表(整个XML里就这一个根节点),然后在循环里只通过eElement.getElementsByTagName("Customer").item(0)取了第一个Customer元素,自然看不到第二条记录。
修改后的代码
咱们直接获取所有<Customer>节点的列表,然后逐个遍历处理:
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; import java.io.File; public class XMLReaderDOM { public static void main(String argv[]) { try { File fXmlFile = new File("Customers.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()); // 直接获取所有Customer节点的集合 NodeList customerList = doc.getElementsByTagName("Customer"); // 遍历每一个Customer节点 for (int temp = 0; temp < customerList.getLength(); temp++) { Node nNode = customerList.item(temp); System.out.println("\nCurrent Element :" + nNode.getNodeName()); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element customerElement = (Element) nNode; // 直接从当前Customer元素读取属性 System.out.println("Customer Name : " + customerElement.getAttribute("Name")); System.out.println("Code : " + customerElement.getAttribute("Code")); System.out.println("Purpose : " + customerElement.getAttribute("Purpose")); } } } catch (Exception e) { e.printStackTrace(); } } }
改动说明
- 获取正确的节点集合:把
doc.getElementsByTagName("Customers")改成doc.getElementsByTagName("Customer"),这样拿到的是所有Customer节点的列表,不管有多少条记录都能覆盖到。 - 遍历每个Customer节点:循环处理
customerList里的每个节点,每个节点对应一条Customer记录。 - 直接读取当前节点属性:不需要嵌套获取第一个Customer,直接从当前转换后的
customerElement里读取Name、Code、Purpose属性,逻辑更清晰。
这样修改后,不管你的XML里有多少个Customer节点,代码都能逐个读取它们的信息啦!
内容的提问来源于stack exchange,提问作者Itok
相关产品推荐
相关产品推荐

