当前位置: 首页 > news >正文

【196】JAVA8 用 DOM 方式的 API 解析XML文件,无需引入第三方依赖。

JAVA8 可以使用标准的 DOM 方式的 API 来编写代码解析 XML 文件,无需引入第三方依赖。下面是两个测试用的 XML 文件:

test.xml

<allData>
    <pan attr1="a" attr2="b">
        1
    </pan>
    <tilt>
        2
    </tilt>
    <zoom>
        3
    </zoom>
    <list>
        <item>
            item0
        </item>
        <item>item1</item>
        <item>item2</item>
    </list>

    <user-list>
        <user>
            <name>
                张三
            </name>
            <gender></gender>
        </user>
        <user>
            <name>
                高启兰
            </name>
            <gender></gender>
        </user>
    </user-list>
</allData>

test2.xml

<allData>
    <pan attr1="a" >
        1
    </pan>
    <zoom>
        3
    </zoom>
    <list>
        <item>
            item0
        </item>
        <item>item1</item>
        <item>item2</item>
    </list>
</allData>

负责接收所有信息的 AllDataDTO.java

package zhangchao;
import java.util.ArrayList;
import java.util.List;

public class AllDataDTO {
    private Integer pan;
    private Integer tilt;
    private Integer zoom;
    private List<String> list = new ArrayList<>();
    private String panAttr1;
    private String panAttr2;
    private List<AllDataUserDTO> userList = new ArrayList<>();
    ///
    //  setters/getters
    ///
    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("AllDataDTO{");
        sb.append("pan=").append(pan);
        sb.append(", tilt=").append(tilt);
        sb.append(", zoom=").append(zoom);
        sb.append(", list=").append(list);
        sb.append(", panAttr1='").append(panAttr1).append('\'');
        sb.append(", panAttr2='").append(panAttr2).append('\'');
        sb.append(", userList=").append(userList);
        sb.append('}');
        return sb.toString();
    }
    public List<AllDataUserDTO> getUserList() {
        return userList;
    }
    public void setUserList(List<AllDataUserDTO> userList) {
        this.userList = userList;
    }
    public List<String> getList() {
        return list;
    }
    public void setList(List<String> list) {
        this.list = list;
    }
    public String getPanAttr1() {
        return panAttr1;
    }
    public void setPanAttr1(String panAttr1) {
        this.panAttr1 = panAttr1;
    }

    public String getPanAttr2() {
        return panAttr2;
    }
    public void setPanAttr2(String panAttr2) {
        this.panAttr2 = panAttr2;
    }
    public Integer getPan() {
        return pan;
    }
    public void setPan(Integer pan) {
        this.pan = pan;
    }
    public Integer getTilt() {
        return tilt;
    }
    public void setTilt(Integer tilt) {
        this.tilt = tilt;
    }
    public Integer getZoom() {
        return zoom;
    }
    public void setZoom(Integer zoom) {
        this.zoom = zoom;
    }
}

负责接收用户信息的 AllDataUserDTO.java

package zhangchao;

public class AllDataUserDTO {
    private String name;
    private String gender;
    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("AllDataUserDTO{");
        sb.append("name='").append(name).append('\'');
        sb.append(", gender='").append(gender).append('\'');
        sb.append('}');
        return sb.toString();
    }
    ///
    //  setters/getters
    ///
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
}

处理 XML 文件的工具类,XmlUtils.java

package zhangchao;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;

public class XmlUtils {
    public static AllDataDTO parseXml(String xmlFilePath) {
        File file = new File(xmlFilePath);
        if (!file.exists()) {
            return null;
        }
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//创建一个DocumentBuilderFactory的对象
        DocumentBuilder builder;
        AllDataDTO allDataDTO = null;
        try {
            builder = factory.newDocumentBuilder();//创建一个DocumentBuilder对象
            Document doc = builder.parse("file:///" + xmlFilePath);
            Element root = doc.getDocumentElement();//获取根节点
            allDataDTO = new AllDataDTO();
            NodeList childNodes = root.getChildNodes();
            int length = childNodes.getLength();
            for (int i = 0; i < length; i++) {
                Node node = childNodes.item(i);
                String nodeName = node.getNodeName();
                if ("pan".equals(nodeName)) {
                    String content = node.getTextContent();
                    content = (content == null ? null : content.trim());
                    Integer tmp = null;
                    try {
                        tmp = Integer.parseInt(content);
                    } catch (NumberFormatException e) {}
                    allDataDTO.setPan(tmp);
                    NamedNodeMap namedNodeMap = node.getAttributes();
                    Node attr1 = namedNodeMap.getNamedItem("attr1");
                    if (attr1 != null) {
                        String attr1Cont = attr1.getTextContent();
                        attr1Cont = (attr1Cont == null ? null : attr1Cont.trim());
                        allDataDTO.setPanAttr1(attr1Cont);
                    }

                    Node attr2 = namedNodeMap.getNamedItem("attr2");
                    if (attr2 != null) {
                        String attr2Cont = attr2.getTextContent();
                        attr2Cont = (attr2Cont == null ? null : attr2Cont.trim());
                        allDataDTO.setPanAttr2(attr2Cont);
                    }

                } else if ("tilt".equals(nodeName)) {
                    String content = node.getTextContent();
                    content = (content == null ? null : content.trim());
                    Integer tmp = null;
                    try {
                        tmp = Integer.parseInt(content);
                    } catch (NumberFormatException e) {}
                    allDataDTO.setTilt(tmp);
                } else if ("zoom".equals(nodeName)) {
                    String content = node.getTextContent();
                    content = (content == null ? null : content.trim());
                    Integer tmp = null;
                    try {
                        tmp = Integer.parseInt(content);
                    } catch (NumberFormatException e) {}
                    allDataDTO.setZoom(tmp);
                } else if ("list".equals(nodeName)) {
                    NodeList itemList = node.getChildNodes();
                    int itemLength = itemList.getLength();
                    for (int j = 0; j < itemLength; j++) {
                        Node item = itemList.item(j);
                        if ("item".equals(item.getNodeName())) {
                            String content = item.getTextContent();
                            content = (content == null ? "" : content.trim());
                            allDataDTO.getList().add(content);
                        }
                    }
                } else if ("user-list".equals(nodeName)) {
                    NodeList userList = node.getChildNodes();
                    int userListLength = userList.getLength();
                    for (int j = 0; j < userListLength; j++) {
                        Node user = userList.item(j);
                        // 读取用户的属性
                        if ("user".equals(user.getNodeName())) {
                            AllDataUserDTO userDTO = new AllDataUserDTO();
                            NodeList params = user.getChildNodes();
                            int paramsLength = params.getLength();
                            for (int k = 0; k < paramsLength; k++) {
                                Node param = params.item(k);
                                String content = param.getTextContent();
                                if (content != null) {
                                    content = content.trim();
                                }
                                String paramName = param.getNodeName();
                                if ("name".equals(paramName)) {
                                    userDTO.setName(content);
                                } else if ("gender".equals(paramName)) {
                                    userDTO.setGender(content);
                                }
                            }
                            allDataDTO.getUserList().add(userDTO);
                        }
                    }
                }
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }
        return allDataDTO;
    }
}

用于测试效果的类 Main.java

package zhangchao;

public class Main {
    public static void main(String[] args) {
        AllDataDTO allDataDTO = XmlUtils
                .parseXml("E:\\ws\\zc\\Java8Xml\\src\\main\\resources\\TestFile\\" +
                        "test.xml");
        AllDataDTO allDataDTO2 = XmlUtils
                .parseXml("E:\\ws\\zc\\Java8Xml\\src\\main\\resources\\TestFile\\" +
                        "test2.xml");
        System.out.println(allDataDTO);
        System.out.println(allDataDTO2);
    }
}

输出结果:

AllDataDTO{pan=1, tilt=2, zoom=3, list=[item0, item1, item2], panAttr1='a', panAttr2='b', userList=[AllDataUserDTO{name='张三', gender='男'}, AllDataUserDTO{name='高启兰', gender='女'}]}
AllDataDTO{pan=1, tilt=null, zoom=3, list=[item0, item1, item2], panAttr1='a', panAttr2='null', userList=[]}

相关文章:

  • vue中使用锚点定位
  • 项目实战——Qt实现FFmpeg音视频转码器
  • Qt5.12.0 与 VS2017 在 .pro文件转.vcxproj文件
  • initdb: command not found【PostgreSQL】
  • TCP/IP四层模型对比OSI七层网络模型的区别是啥?数据传输过程原来是这样的
  • 【C++】list容器功能模拟实现
  • Spring Boot整合MyBatis-Plus
  • 【BBuf的CUDA笔记】十三,OpenAI Triton 入门笔记一
  • NLP自然语言处理原理应用讲解
  • LeetCode59 螺旋矩阵 II
  • k8s---ingress对外服务(traefik)
  • C# 基础入门
  • UE4 添加按键输入事件 并在蓝图中使用按键输入节点
  • Java算法 leetcode简单刷题记录4
  • 【Linux工具篇】软件包管理器yum
  • HarmonyOS 应用开发入门
  • c语言0基础笔记
  • 【轮式平衡机器人】——软硬件配置/准备
  • FFmpeg教程:libswscale对图像进行简单处理
  • NetSuite 文心一言(Ernie)的AI应用
  • 中华人民共和国和巴西联邦共和国关于强化携手构建更公正世界和更可持续星球的中巴命运共同体,共同维护多边主义的联合声明
  • 通化市委书记孙简升任吉林省副省长
  • 沙县小吃中东首店在沙特首都利雅得开业,首天营业额5万元
  • 季后赛主场优势消失之谜,这事竟然要赖库里
  • 山东枣庄同一站点两名饿了么骑手先后猝死,当地热线:职能部门正调查
  • 有关部门负责人就《新时代的中国国家安全》白皮书答记者问