XML的解析

​ 1.xml解析方式:

DOM(xml全部加载到内存中,生成一个document对象)
SAX(逐行扫描,边扫描边解析)

2.dom4j解析xml

  • 引入dom4j maven依赖(dom4j:xml解析的类库 )
  <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version>
        </dependency>
  • 使用dom4j解析user.xml

案例解析对象 user.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE users SYSTEM "user.dtd">

<users>
   
    <user id="TB1001" country="Chinese" source="Android">
        <id>10001</id>
        <name>admin</name>
        <password>111111</password>
        <salary> salaty >15000 &amp; salary &lt;  30000</salary>
      
    </user>

    <user id="TB1002" country="Chinese" source="Ios">
        <id>10002</id>
        <name>admin2</name>
        <password>22    22</password>
        <salary> salaty >15000 &amp; salary &lt;  30000</salary>
    </user>
</users>

解析程序

几个方法:

  • 获取根标签 : Element rootElement = document.getRootElement();
  • 获取根标签的子标签: List<Element> elements = rootElement.elements();
  • 获取子标签的属性:List<Attribute> attributes = element.attributes();
  • 获取子子标签: List<Element> elementList = element.elements();
  • 获取子子标签的文本:element1.getText()
  • 获取第一个user子标签: Element user = rootElement.element("user");
  • 获取user标签的子标签password的文本String password = user.elementText("password");
    @Test
    public void TestDom4j() {
        //创建解析器对象
        SAXReader saxReader = new SAXReader();
        //读取xml生成document对象
        try {
            Document document = saxReader.read(Dom4j.class.getClassLoader().getResource("user.xml"));
            //根据document对象可以获取xml的元素信息
            Element rootElement = document.getRootElement();
            //根结点的名字
            System.out.println("根结点的名字:  " + rootElement.getName());

            //获取标签的子标签
            List<Element> elements = rootElement.elements();
            for (Element element : elements) {
                System.out.println("users标签的子标签:__"+element.getName()+"__的id属性值:"+element.attributeValue("id"));
                List<Attribute> attributes = element.attributes();
                for (Attribute attribute : attributes) {
                    System.out.println("user标签的属性__"+attribute.getName()+"__属性值:"+attribute.getText());
                }
                List<Element> elementList = element.elements();
                for (Element element1 : elementList) {
                    System.out.println("user的子标签:__"+element1.getName()+"__的文本"+element1.getText());
                }
            }

            //获取users标签的第一个user标签
            Element user = rootElement.element("user");
            //第一个user标签password的文本
            //elementText 获取指定子标签的文本
            String password = user.elementText("password");
            System.out.println("第一个user的password:"+password);


        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }


结果:
在这里插入图片描述

3.dom4j结合Xpath解析xml

用路径来选中对应的节点**

  • 引入jaxen maven依赖
  <dependency>
            <groupId>jaxen</groupId>
            <artifactId>jaxen</artifactId>
            <version>1.2.0</version>
        </dependency>
  • 使用Xpath解析user.xml

案例解析对象 user.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE users SYSTEM "user.dtd">

<users>
   
    <user id="TB1001" country="Chinese" source="Android">
        <id>10001</id>
        <name>admin</name>
        <password>111111</password>
        <salary> salaty >15000 &amp; salary &lt;  30000</salary>
      
    </user>

    <user id="TB1002" country="Chinese" source="Ios">
        <id>10002</id>
        <name>admin2</name>
        <password>22    22</password>
        <salary> salaty >15000 &amp; salary &lt;  30000</salary>
    </user>
</users>

解析程序

xpath语法:

  • 绝对路径方式方法 以/开头,从根元素开始,/元素/子元素/子子元素
  • 相对路径,相对于当前结点元素继续查找结点
  • 全文搜索 //子元素 无论中间多少层直接获取所有满足条件的子元素
  • /表示一层
  • 谓语(条件筛选形式) //元素[@atrr1=value]
  • element是node子类,方法更多,使用更便捷
  @Test
    public void TestXpath(){
        SAXReader saxReader = new SAXReader();
        //target文件下面的xml
        try {
            Document document = saxReader.read(Dom4j.class.getClassLoader().getResource("user.xml"));
            //第一个用户的密码
            //强制转换(右键看图实现),不强制转换不可使用对应的方法
            //绝对路径:
            Element element= (Element)document.selectSingleNode("/users/user/password");
            System.out.println("第一个用户的密码:"+element.getText());


            //相对路径(相对password)
            //  ../ 表示返回上一层
            Element element2 =(Element) element.selectSingleNode("../salary");
            System.out.println("salary:"+element2.getText());


            //全文搜索
            //获取所有的id
            List<Node> nodes = document.selectNodes("//id");
            for (Node node : nodes) {
                Element elementid=(Element) node;
                System.out.println("所有id元素的文本"+elementid.getText());
            }


            //谓语形式
            //user id为tb1002
            Element tb1002element = (Element)document.selectSingleNode("//user[@id='TB1002']");
            List<Element> list = tb1002element.elements();
            for (Element elementuser : list) {
                System.out.println(elementuser.getName() + ":"+elementuser.getText());
            }

        } catch (DocumentException e) {
            e.printStackTrace();
        }


    }

​ 4.强制转换补充知识

向上转型和向下转型
向上:子赋值给父(父类引用指向子类对象),能调用父所有,不能调用子特有
向下:子类对象指向父类引用 调用子类所有
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值