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 + '\'' +
'}';
}
}