sax - 解析

maven 依赖

    <!-- Xml解析 -->
    <dependency>
        <groupId>org.dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>2.1.3</version>
        <scope>compile</scope>
    </dependency>

工具类

这些函数是日常开发中比较常用的,一些老旧系统,数据会以 xml 格式返回。

除此之外能用到的,估计就是分析 mybatis 配置文件了,可以实现一些代码解析工作。

下列代码中,转 java 对象的代码的函数,会出现依赖缺失,可以用 java 反射技术完善这些函数。

详见:https://gitee.com/seaboot/commons

import cn.seaboot.commons.core.Converter;
import cn.seaboot.commons.reflect.FieldAccess;
import cn.seaboot.commons.reflect.ObjectField;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 包含一些常见的 xml 数据解析
 *
 * @author Mr.css
 * @version 2022-08-24 16:57
 */
public class SaxUtils {

    /**
     * 将文件转换为 ListMap 格式
     * <p>
     * 通常用于简单的数据报文解析,IO 流中只包含格式简单的数据。
     *
     * <root>
     * <person><name>ming</name><age>33</age></person>
     * <person><name>ming</name><age>33</age></person>
     * </root>
     *
     * @param is 输入流
     * @return 数据
     */
    public static List<Map<String, Object>> toListMapByElement(InputStream is) throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(is);

        // 获取根节点
        Element root = document.getRootElement();
        return SaxUtils.toListMapByElement(root);
    }

    /**
     * 将文件转换为 ListMap 格式
     * <p>
     * 通常用于简单的数据报文解析,IO 流中只包含格式简单的数据。
     *
     * <root>
     * <person name = "min" age = "33">
     * <person name = "min" age = "33">
     * </root>
     *
     * @param is 输入流
     * @return 数据
     */
    public static List<Map<String, Object>> toListMapByAttribute(InputStream is) throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(is);

        // 获取根节点
        Element root = document.getRootElement();
        return SaxUtils.toListMapByAttribute(root);
    }

    /**
     * 将某个节点下的所有子节点转换为 ListMap 格式,数据取自节点的 attribute 属性
     *
     * <list>
     * <person name = "min" age = "33">
     * <person name = "min" age = "33">
     * </list>
     *
     * @param element 节点
     * @return 数据
     */
    public static List<Map<String, Object>> toListMapByAttribute(Element element) {
        List<Element> elements = element.elements();
        List<Map<String, Object>> res = new ArrayList<>(elements.size());
        for (Element ele : elements) {
            res.add(toMapByAttribute(ele));
        }
        return res;
    }


    /**
     * 将某个节点下的所有子节点转换为 ListMap 格式,数据取自节点的 text 属性
     *
     * <list>
     * <person><name>ming</name><age>33</age></person>
     * <person><name>ming</name><age>33</age></person>
     * </list>
     *
     * @param element 节点
     * @return 数据
     */
    public static List<Map<String, Object>> toListMapByElement(Element element) {
        List<Element> elements = element.elements();
        List<Map<String, Object>> res = new ArrayList<>(elements.size());
        for (Element ele : elements) {
            res.add(toMapByElement(ele));
        }
        return res;
    }


    /**
     * 将节点的属性转换为 Map
     *
     * <person name = "min" age = "33">
     *
     * @param element 节点
     * @return ret
     */
    public static Map<String, Object> toMapByAttribute(Element element) {
        Map<String, Object> ret = new HashMap<>();
        List<Attribute> attributes = element.attributes();
        for (Attribute attribute : attributes) {
            ret.put(attribute.getName(), attribute.getValue());
        }
        return ret;
    }


    /**
     * 将某个节点的所有子节点转换为 Map
     *
     * <person><name>ming</name><age>33</age></person>
     *
     * @param element 节点
     * @return ret
     */
    public static Map<String, Object> toMapByElement(Element element) {
        Map<String, Object> ret = new HashMap<>();
        List<Element> list = element.elements();
        for (Element ele : list) {
            ret.put(ele.getName(), ele.getText());
        }
        return ret;
    }


    /**
     * 将某个节点的所有子节点转换为 Map
     *
     * <property name="name">ming</person>
     * <property name="age">33</person>
     *
     * @param element 节点
     * @return ret
     */
    public static Map<String, Object> toMapByProperty(Element element) {
        Map<String, Object> ret = new HashMap<>();
        List<Element> list = element.elements();
        for (Element ele : list) {
            ret.put(ele.attribute("name").getValue(), ele.getText());
        }
        return ret;
    }

    /**
     * 将节点的属性转换为 Object
     *
     * <person name = "min" age = "33">
     *
     * @param element 节点
     * @return ret
     */
    public static <T> T toObjectByAttribute(Element element, Class<T> clazz) {
        FieldAccess access = FieldAccess.create(clazz);
        T ret = access.newInstance();
        List<Attribute> attributes = element.attributes();
        for (Attribute attribute : attributes) {
            ObjectField field = access.getField(attribute.getName());
            field.setValue(ret, Converter.convert(attribute.getValue(), field.getFieldType()));
        }
        return ret;
    }

    /**
     * 将某个节点的所有子节点转换为 Object
     *
     * <person><name>ming</name><age>33</age></person>
     *
     * @param element 节点
     * @return ret
     */
    public static <T> T toObjectByElement(Element element, Class<T> clazz) {
        FieldAccess access = FieldAccess.create(clazz);
        T ret = access.newInstance();
        List<Element> list = element.elements();
        for (Element ele : list) {
            ObjectField field = access.getField(ele.getName());
            field.setValue(ret, Converter.convert(ele.getText(), field.getFieldType()));
        }
        return ret;
    }
}

posted on 2024-06-13 21:31  疯狂的妞妞  阅读(1)  评论(0编辑  收藏  举报

导航