如何从XML文件提取数据并存入Java数组或ArrayList
从XML提取数据存入Java数组/ArrayList实现方案
针对你给出的XML结构,直接按以下步骤实现即可,不需要复杂的第三方依赖:
第一步:定义数据存储实体
XML中每个<record>节点对应id、full_name两个字段,先写对应的实体类做封装:
public class UserRecord { private Integer id; private String fullName; public UserRecord(Integer id, String fullName) { this.id = id; this.fullName = fullName; } public Integer getId() { return id; } public String getFullName() { return fullName; } }
第二步:DOM解析读取XML存入集合
JDK自带DOM解析工具,不需要额外导包,直接写解析逻辑:
import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.File; import java.util.ArrayList; import java.util.List; public class XmlParseTest { public static void main(String[] args) { // 初始化ArrayList存储结果 List<UserRecord> recordList = new ArrayList<>(); try { // 加载目标XML文件 DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(new File("替换成你的XML文件实际路径")); doc.getDocumentElement().normalize(); // 获取所有record节点 NodeList recordNodes = doc.getElementsByTagName("record"); // 遍历节点提取字段 for (int i = 0; i < recordNodes.getLength(); i++) { Element recordEle = (Element) recordNodes.item(i); Integer id = Integer.parseInt(recordEle.getElementsByTagName("id").item(0).getTextContent().trim()); String fullName = recordEle.getElementsByTagName("full_name").item(0).getTextContent().trim(); recordList.add(new UserRecord(id, fullName)); } // 如果需要转成固定长度数组,直接调用转数组方法即可 UserRecord[] recordArr = recordList.toArray(new UserRecord[0]); // 打印验证结果 recordList.forEach(record -> System.out.println(record.getId() + " : " + record.getFullName())); } catch (Exception e) { e.printStackTrace(); } } }
补充说明
- 上述代码跑通的前提是XML格式合法,你给出的示例XML缺少闭合的
</dataset>标签,实际使用时要补全,否则会报解析错误 - 如果XML文件体积超过100M,不要用DOM解析(会把全量文件加载到内存占资源),换成SAX或者StAX流式解析即可,核心的字段提取、存入集合的逻辑是通用的
- 如果字段可能为空,要在
parseInt、取文本内容的位置加非空判断,避免空指针或者数字格式转换异常 - 如果需要用数组而非ArrayList,可以先获取
recordNodes.getLength()得到总数据量,直接初始化对应长度的UserRecord数组,遍历节点时直接按下标存入数组即可,不需要先存List再转换。
内容的提问来源于stack exchange,提问作者indo3933
相关产品推荐
相关产品推荐

