Java之xml解析(Stax方式)

STAX

StAX (Streaming API for XML) 解析器提供了一种流式解析 XML 文档的方式。它类似于 SAX 解析器,但提供了更直观的 API。您可以使用 javax.xml.stream.XMLStreamReader 类来创建一个 StAX 解析器,并使用它逐行读取 XML 文档的内容。StAX 解析器允许您在解析过程中选择性地提取所需的数据,并具有较低的内存消耗。使用 javax.xml.stream.XMLStreamWriter 类来创建一个 StAX 解析器,并使用它逐行写入 XML 文档的内容。

XML与java对象之间的转换
1.xml文件的内容
<?xml version="1.0" encoding="UTF-8"?>
<note type="local">
    <to>George</to>
    <from>John</from>
    <heading>Reminder</heading>
</note>
2.XML与java对象之间的转换code
package test_stax;

import javax.xml.stream.*;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class Test {
    public static void main(String[] args) throws FileNotFoundException {
        // 读取 XML 文件并转换为 Java 对象
        Note note = readXMLToObject("C:\\Users\\mats\\IdeaProjects\\xmlParses\\src\\resource\\xml\\hello.xml");
        System.out.println("Java Object:");
        System.out.println(note);

        // 将 Java 对象转换为 XML 文件
        writeObjectToXML(note, "C:\\Users\\mats\\IdeaProjects\\xmlParses\\src\\resource\\xml\\hello_new.xml");
    }

    public static Note readXMLToObject(String xmlFilePath) {
        Note note = null;
        XMLInputFactory inputFactory = XMLInputFactory.newInstance();

        try {
            XMLStreamReader reader = inputFactory.createXMLStreamReader(xmlFilePath,
                    Thread.currentThread().getContextClassLoader().getResourceAsStream(xmlFilePath));

            while (reader.hasNext()) {
                int event = reader.next();

                if (event == XMLStreamConstants.START_ELEMENT) {
                    if ("note".equals(reader.getLocalName())) {
                        note = new Note();
                        note.setType(reader.getAttributeValue(null, "type"));
                    } else if ("to".equals(reader.getLocalName())) {
                        note.setTo(reader.getElementText());
                    } else if ("from".equals(reader.getLocalName())) {
                        note.setFrom(reader.getElementText());
                    } else if ("heading".equals(reader.getLocalName())) {
                        note.setHeading(reader.getElementText());
                    }
                }
            }
            reader.close();
        } catch (XMLStreamException e) {
            e.printStackTrace();
        }
        return note;
    }

    public static void writeObjectToXML(Note note, String xmlFilePath) {
        XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();

        try {
            XMLStreamWriter writer = outputFactory.createXMLStreamWriter(
                    new FileOutputStream(xmlFilePath), "UTF-8");

            writer.writeStartDocument("UTF-8", "1.0");
            writer.writeCharacters("\n");  // 添加换行符


            writer.writeStartElement("note");
            writer.writeAttribute("type", note.getType());

            writer.writeCharacters("\n");  // 添加换行符
            writer.writeCharacters("    ");  // 添加缩进

            writer.writeStartElement("to");
            writer.writeCharacters(note.getTo());
            writer.writeEndElement();

            writer.writeCharacters("\n");  // 添加换行符
            writer.writeCharacters("    ");  // 添加缩进

            writer.writeStartElement("from");
            writer.writeCharacters(note.getFrom());
            writer.writeEndElement();

            writer.writeCharacters("\n");  // 添加换行符
            writer.writeCharacters("    ");  // 添加缩进

            writer.writeStartElement("heading");
            writer.writeCharacters(note.getHeading());
            writer.writeEndElement();

            writer.writeCharacters("\n");  // 添加换行符

            writer.writeEndElement();
            writer.writeEndDocument();

            writer.flush();
            writer.close();
        } catch (XMLStreamException | FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

class Note {
    private String type;
    private String to;
    private String from;
    private String heading;

    // 构造函数和 getter/setter 方法省略

    // Getter 和 Setter 方法省略

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getTo() {
        return to;
    }

    public void setTo(String to) {
        this.to = to;
    }

    public String getFrom() {
        return from;
    }

    public void setFrom(String from) {
        this.from = from;
    }

    public String getHeading() {
        return heading;
    }

    public void setHeading(String heading) {
        this.heading = heading;
    }

    @Override
    public String toString() {
        return "Note{" +
                "type='" + type + '\'' +
                ", to='" + to + '\'' +
                ", from='" + from + '\'' +
                ", heading='" + heading + '\'' +
                '}';
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值