Java读取XML文件提取指定标签至列表的技术求助
解决方案:提取XML中的name和birthday并格式化输出
嘿,作为Java新手碰到XML解析的问题确实容易摸不着头脑,我来帮你搞定这个需求~ 下面给你两种实用的实现方式,你可以根据自己的情况选择:
方法一:用JDK自带的DOM解析(无需额外依赖)
这种方式不需要引入任何第三方库,直接用JDK自带的API就能完成,适合快速上手理解XML的节点结构:
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.StringReader; public class XmlParserExample { public static void main(String[] args) { // 你的XML内容,实际项目中也可以替换成读取本地文件的方式 String xmlContent = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + "<Personen>" + " <Person>" + " <birthday>2002-03-01</birthday>" + " <name>sad</name>" + " <comment>Test Comment</comment>" + " </Person>" + " <Person>" + " <birthday>1999-02-21</birthday>" + " <name>Test1</name>" + " <comment>Test Comment</comment>" + " </Person>" + " <Person>" + " <birthday>2005-02-21</birthday>" + " <name>Test2</name>" + " <comment>Test Comment</comment>" + " </Person>" + "</Personen>"; try { // 1. 创建DOM解析器工厂和解析器实例 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); // 2. 解析XML字符串,生成内存中的DOM树 Document document = builder.parse(new StringReader(xmlContent)); // 3. 获取所有<Person>节点的列表 NodeList personNodes = document.getElementsByTagName("Person"); // 4. 遍历每个Person节点,提取name和birthday并格式化输出 System.out.println("$list->:"); for (int i = 0; i < personNodes.getLength(); i++) { Element personElement = (Element) personNodes.item(i); // 提取name标签的文本内容 String name = personElement.getElementsByTagName("name").item(0).getTextContent(); // 提取birthday标签的文本内容 String birthday = personElement.getElementsByTagName("birthday").item(0).getTextContent(); // 按照你需要的格式打印 System.out.printf("\"%s\",\"%s\"%n", name, birthday); } } catch (Exception e) { // 捕获并打印异常,方便调试 e.printStackTrace(); } } }
代码说明:
- 首先把你的XML内容存为字符串,实际开发中如果是读取文件,可以用
FileInputStream代替StringReader。 - DOM解析会把整个XML加载到内存中形成树状结构,我们通过标签名找到对应的节点,再提取文本内容。
- 最后用
printf方法格式化输出成你需要的"name","birthday"格式。
方法二:用JAXB实现面向对象的解析(更简洁)
如果后续你还要对这些数据做更多操作,JAXB会更合适——它能直接把XML转换成Java对象,代码更简洁易维护:
第一步:创建对应的实体类
先定义两个和XML结构对应的Java类,用JAXB注解映射XML标签:
Person.java
import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "Person") public class Person { private String name; private String birthday; @XmlElement public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlElement public String getBirthday() { return birthday; } public void setBirthday(String birthday) { this.birthday = birthday; } }
Personen.java
import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import java.util.List; @XmlRootElement(name = "Personen") public class Personen { private List<Person> personList; @XmlElement(name = "Person") public List<Person> getPersonList() { return personList; } public void setPersonList(List<Person> personList) { this.personList = personList; } }
第二步:编写解析代码
import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; import java.io.StringReader; public class JaxbParserExample { public static void main(String[] args) { String xmlContent = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + "<Personen>" + " <Person>" + " <birthday>2002-03-01</birthday>" + " <name>sad</name>" + " <comment>Test Comment</comment>" + " </Person>" + " <Person>" + " <birthday>1999-02-21</birthday>" + " <name>Test1</name>" + " <comment>Test Comment</comment>" + " </Person>" + " <Person>" + " <birthday>2005-02-21</birthday>" + " <name>Test2</name>" + " <comment>Test Comment</comment>" + " </Person>" + "</Personen>"; try { // 创建JAXB上下文,指定根实体类 JAXBContext context = JAXBContext.newInstance(Personen.class); Unmarshaller unmarshaller = context.createUnmarshaller(); // 把XML字符串反序列化成Java对象 Personen personen = (Personen) unmarshaller.unmarshal(new StringReader(xmlContent)); // 遍历Person列表,格式化输出 System.out.println("$list->:"); for (Person person : personen.getPersonList()) { System.out.printf("\"%s\",\"%s\"%n", person.getName(), person.getBirthday()); } } catch (Exception e) { e.printStackTrace(); } } }
代码说明:
- JAXB是Java自带的API(Java 9及以后需要添加
jaxb-api依赖,Maven可以直接引入),通过注解把XML标签和Java属性绑定。 - 反序列化后,我们直接操作Java对象就可以获取name和birthday,非常适合复杂XML场景。
两种方法都能完美实现你的需求,新手可以先从DOM解析开始,理解XML的节点结构;如果需要更优雅的代码,就选JAXB。
内容的提问来源于stack exchange,提问作者M4I3X
相关产品推荐
相关产品推荐

