Java XMLStreamReader解析读取XML文件
一、XMLStreamReader
XMLStreamReader 是设计的最底层的接口,同时也是一种高效的读取xml文件的方式,它是通过迭代的方式,使用hasNext()和next()来访问和解析xml的。
二、示例
1. XML文件
<?xml version="1.0" encoding="utf-8"?>
<!-- 形如<XXX>或<XXX为start element, 形如</>或 />为end element -->
<People>
<Girl name="燕子" age="18" remark="Girl Friend" />
</People>
2. Java代码
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import java.io.FileInputStream;
public class Demo {
public static void main(String[] args) {
try {
String xmlFile = "D:/Data.xml";
XMLStreamReader xmlReader = XMLInputFactory.newFactory().createXMLStreamReader(new FileInputStream(xmlFile));
while(xmlReader.hasNext()){
if(xmlReader.next() == XMLStreamConstants.START_ELEMENT){
if("Girl".equals(xmlReader.getLocalName())){
String name = xmlReader.getAttributeValue(null, "name");
String age = xmlReader.getAttributeValue(null, "age");
System.out.println("有一个叫"+name+"的女孩, 年龄为"+age);
}
}
}
}catch (Exception e){
System.out.println(e);
}
}
}
2. 设计一个通用的配置类
<?xml version="1.0" encoding="utf-8"?>
<Config>
<Width value="10" remark="宽度" />
<Height value="90" remark="高度" />
<Color value="red" remark="颜色" />
</Config>
package com.example;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import java.io.FileInputStream;
import java.lang.reflect.Field;
import java.util.Arrays;
public class CommonConfig {
// 宽度
public String width;
// 高度
public String height;
// 颜色
public String color;
public CommonConfig(String filename){
Field[] fields = this.getClass().getDeclaredFields();
try(FileInputStream input = new FileInputStream(filename)) {
XMLStreamReader xmlReader = XMLInputFactory.newFactory().createXMLStreamReader(input);
while(xmlReader.hasNext()){
if(xmlReader.next() == XMLStreamConstants.START_ELEMENT){
String nodeName = xmlReader.getLocalName();
// 查找结点名对应的属性名
Field field = Arrays.stream(fields).
filter(x -> x.getName().equalsIgnoreCase(nodeName)).findFirst().orElse(null);
if(field != null){
String value = xmlReader.getAttributeValue(null, "value");
field.set(this, value); // 设置值
}
}
}
}catch (Exception e){
System.out.println(e.toString());
}
}
}
package com.example;
public class demo {
public static void main(String[] args) {
CommonConfig config = new CommonConfig("D:/config.xml");
System.out.println(config.width);
System.out.println(config.height);
System.out.println(config.color);
}
}
三、总结
XMLStreamReader作为偏底层的接口,一般不了解xml结构的会使用其它第三方依赖来解决配置的问题,但对于学习xml的解析原理来说,或者是简单的一个读取,它还是有基础价值的。