You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:56:49