dom4j

依赖jar:

1、自定义文件

<?xml version="1.0" encoding="utf-8" ?>
<Root>
    <user id="001">
        <admin name="onepa">
            <name id="ceId" yong="yes">fred</name>
            <password>150150</password>
            <age>22</age>
        </admin>
        <admin>
            <name>yucai</name>
            <password>123456</password>
            <age>21</age>
        </admin>
    </user>
</Root>

2、demo类

package com.demo.dom4j;

import org.dom4j.*;

import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.List;

/**
 * 1.注意防止XXE注入攻击
 * 2.获取标签属性值时,分两种情况
 *      如果为Element对象实例时
 *          1.attributes()方法
 *          2.selectSingleNode("@name").getText(),该方法需要注意.selectSingleNode("@name")不为空,即确保用name属性可以选中该元素。
 *      如果为Node对象的实例时:
 *          1.selectSingleNode("@name").getText(),该方法需要注意.selectSingleNode("@name")不为空,即确保用name属性可以选中该元素。
 */
public class Test
{
    public static void main(String[] args)
    {
        readXML01();
        readXML02();
    }

    /***
     * dom4j 1.6版本集成了jaxen组件
     * 解析xml文件,直接定位到需要选择的节点
     *  dom4j 2.10版本,jdk版本1.8
     *  jaxen.jar
     */
    private static void readXML01()
    {
        // 需要解析的xml文件
        String path = "F:\java-demo\java-demo\src\com\demo\dom4j\info.xml";
        File file = new File(path);
        // xml解析对象
        SAXReader reader = new SAXReader();
        // dom4j中的文档对象模型
        Document document = null;

        try
        {
            // 将需要解析的xml文件转换成dom4j中的文档对象模型
            document = reader.read(file);

            // 使用dom4j解析XML时,要快速获取某个节点的数据,使用XPath是个不错的方法,需要jaxen.jar包支持.需要解析的节点路径,路径由xml文件中的标签组成
            // 该路径包含两种情况:1.该节点下面还有子节点。2.该节点下无子节点
            String pathBq = "Root/user/admin/name";
            List<Node> nodeList = document.selectNodes(pathBq); // 根据节点路径定位节点,Node为dom4j中的类
            for(Node node : nodeList)
            {
                System.out.println("*******************************************");
                // 当xpath下无子节点时,getText()和getStringValue()返回值一样
                System.out.println("标签名称:"+node.getName());
                System.out.println("标签元素值:"+node.getText());
                System.out.println("标签下所有子标签元素值:"+node.getStringValue());

                // 判断当前节点是否可以通过属性值yong选中,即判断当前节点是否具有yong属性。
                if (null != node.selectSingleNode("@yong"))
                {
                    System.out.println("该标签有yong属性,其值为:"+node.selectSingleNode("@yong").getText());
                }
            }
        }
        catch (DocumentException e)
        {
            e.printStackTrace();
        }
    }

    /***
     * 多级父元素属性值的获取
     */
    private static void readXML02()
    {
        String path = "F:\java-demo\java-demo\src\com\demo\dom4j\info.xml";
        File file = new File(path);
        SAXReader reader = new SAXReader();
        Document document = null;
        try
        {
            document = reader.read(file);
            String pathBq = "Root/user/admin/name";
            List<Node> nodeList = document.selectNodes(pathBq);
            for(Node node : nodeList)
            {
                System.out.println("************************************");
                Element oneparent = node.getParent();// 获取节点的父元素
                Element twoparent = node.getParent().getParent();//获取元素的父元素
                System.out.println("一级父元素标签名:"+oneparent.getName());
                List<Attribute> attributes = oneparent.attributes();// 父元素的所有属性值
                for (Attribute temp : attributes)
                {
                    System.out.println("属性名称:"+temp.getName());
                    System.out.println("属性值:"+temp.getValue());
                }
                System.out.println("二级父元素标签名:"+twoparent.getName());
            }
        }
        catch (DocumentException e)
        {
            e.printStackTrace();
        }
    }
}

  

原文地址:https://www.cnblogs.com/nevegiveup/p/8688994.html