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的解析原理来说,或者是简单的一个读取,它还是有基础价值的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值