XML

本文详细介绍了XML的起源、功能和命名规范,强调了XML在配置文件和数据传输中的作用。接着深入探讨了两种解析XML的方法:DOM和SAX,包括它们的特点和适用场景。特别地,文章重点讲解了DOM4J解析器的使用,包括导入DOM4J库、获取XML标签、属性和文本的方法,并提供了实例代码示例。
摘要由CSDN通过智能技术生成

一.XML概述

  1. 起源:W3C万维网联盟,先定义出来的是HTML,XML推出的初衷是为了替换HTML(HTML语法过于松散,为了规范,推出了XML语言),后来,XML语言用作配置文件,封装数据,版本只有一个v1.0
  2. 概念:XML是一种可扩展标记语言,即标签可以自定义
  3. 命名规范:不能以数字开头,不能使用纯数字,区分大小写
  4. 功能:
    • a.配置文件
    • b.网络数据传输的载体
  5. 语法:新建一个文本文件,后缀名必须为.xml
  6. 组成部分
    • a.文档声明:<?xml version="1.0" encoding="utf-8"?>
      encoding:告诉浏览器用什么编码去解析
      文档声明必须在顶格
    • b.根标签:有且仅有一个根标签
    • c.其他标签:有开始标签,一定要有结束标签
    • d.文本:CDATA区:该区域的文本,会按照纯文本解析
      文本格式:<![CDATA[内容]]>
<?xml version="1.0" encoding="UTF-8"?>  
<students>  
    <student id="s001">  
        <name>张三</name>  
        <age>23</age>  
        <tel>123456</tel>  
    </student>  
    <student id="s002">  
        <name>李四</name>  
        <age>24</age>  
        <tel>134567</tel>  
    </student>  
</students>  

二.解析XML

DOM

  1. DOM(Document Object Model 文档对象模型):将文档的各个组成部分抽取一个对象
    Element:标签对象
    Attribute:属性对象
    Text:文本对象
    Comment:注释对象
    Node:节点对象
    Doucment:文档对象
  2. 解析过程:将文档一次性,加载进内存,然后将文档各个组成部分抽取为对象
  3. 优缺点:
    • a.优点:能够对文档进行增删改查
    • b.缺点:耗内存,适用pc端

SAX

  1. SAX:基于事件,逐行解析,一次读取一行,释放一行
  2. 优缺点:
    • a.优点:不占内存,适用于移动端
    • b.缺点:只能查,不能增删改

常用解析器

  1. DOM4J:第三方jar包,实现了DOM思想
  2. Pull解析器:第三方jar包,实现了SAX思想

三.DOM4J解析器

步骤

  1. 导入DOM4J的jar包
  2. 将xml文件,放入工程根目录
    这里写图片描述

people.xml:

<?xml version="1.0" encoding="UTF-8"?>  
<people>  
    <user id="001">  
        <name>张三</name>    
        <tel>123456</tel>  
    </user>  
    <user id="002">  
        <name>李四</name>    
        <tel>134567</tel>  
    </user>
    <user id="00">  
        <name>王一</name>    
        <tel>1345674</tel>  
    </user>   
</people>  

获取标签对象

  1. getRootElement():获取根标签对象
  2. element():获取根标签下的子标签,默认获取的是第一个子标签
  3. Elements():获取所有子标签对象
  4. elementesiterator():获取所有子标签对象
public class Demo1 {
    public static void main(String[] args) throws Exception, Exception{
        //创建解析器对象
        SAXReader reader = new SAXReader();

        //加载XML文件
        Document doc = reader.read(new FileInputStream("people.xml"));

        //getRootElement():获取根标签对象
        Element rootEle= doc.getRootElement();

        //element():获取根标签下的子标签,默认获取的是第一个子标签
        Element userEle = rootEle.element("user");

        //getName():得到子标签名称
        System.out.println(userEle.getName());

        //elements():获取所有子标签
        List<Element> userEles = rootEle.elements();
        for(Element ele:userEles){
            System.out.println(ele.getName());
        }

        //elementesiterator():获取所有子标签对象
        Iterator<Element> elementIterator = rootEle.elementIterator();  
        while (elementIterator.hasNext()) {  
            Element element = elementIterator.next();  
            System.out.println(element.getName());  
        }  
    }
}

获取属性对象和标签之间的文本

获取属性对象
  1. attribute():获取单个属性对象
  2. attributes():获取所有属性对象
  3. attributeiterator():获取所有属性对象
  4. attributeValue():直接获取属性对象的值
public class Demo2{  
    public static void main(String[] args) throws Exception {  
        // 创建解析器对象  
        SAXReader reader = new SAXReader();  

        // 加载xml文件  
        Document doc = reader.read(new FileInputStream("people.xml"));  

        // 方式1:分布获取属性对象  
        // getRootElement():获取跟标签对象  
        Element rootElement = doc.getRootElement();  

        // element():获取属性对象  
        Element element = rootElement.element("user");  

        // attribute("id"):获取id属性 
        Attribute attribute = element.attribute("id");  

        // getValue():获取属性值
        // getName():获取属性名  
        String value = attribute.getValue();  
        String name = attribute.getName();  
        System.out.println(name + "---" + value);
        System.out.println("--------------------------");

        // 方式2:attributeValue():直接获取属性值  
        String value2 = rootElement.element("user").attributeValue("id");  
        System.out.println(value2);  
        System.out.println("------------------"); 

        // 方式3:attributes():获取所有属性对象   
        List<Attribute> attributes = rootElement.element("user").attributes();  
        for (Attribute attr : attributes) {  
            String name2 = attr.getName();  
            String value3 = attr.getValue();  
            System.out.println(name2 + "---" + value3);  
        }  
        System.out.println("------------------");

        // attributeIterator():通过迭代器获取所有属性对象    
        Iterator<Attribute> attributeIterator = rootElement.element("student").attributeIterator();  
        while (attributeIterator.hasNext()) {  
            Attribute attribute2 = attributeIterator.next();  
            System.out.println(attribute2.getName() + "---" + attribute2.getValue());  
        }  
    }  
}  
获取标签之间的文本
  1. getText():拿出文本
  2. elementText("name"):拿出该标签中的文本
public class Demo2{  
    public static void main(String[] args) throws Exception {  
        // 创建解析器对象  
        SAXReader reader = new SAXReader();  

        // 加载xml文件  
        Document doc = reader.read(new FileInputStream("people.xml"));  

        // 方式1:层层往下拿  
        String text1 = doc.getRootElement().element("user").element("tel").getText();  
        System.out.println(text1);  

        // 方式2:一步到位  
        String text2 = doc.getRootElement().element("user").elementText("tel");  
        System.out.println(text2); 
    }  
}  

获取所有节点

  1. node():获取单个节点对象
    nodeiterator():获取多个节点对象,只能获取子结点
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值