XML

1、简介

XML,eXtendsible Markup Language。可扩展标记语言
由W3C组织发布,目前推荐遵守的是W3C组织于2000年发布的XML1.0规范
XML主要用来传输和存储数据

特点:
没有预定义标签,都是自定义标签

2、语法规则

XML声明要么不写,要写就要写在第一行,并且前面不能有任何字符
严格区分大小写
标签不能以数字开头
⑷ 属性必须有值,且必须用引号引起来
⑸ 只能有一个根标签
⑹ 标签必须正确地结束
⑺ 标签不能交叉嵌套
⑻ 注释不能嵌套

3、HelloWorld

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

<books>
    <book id="1">
        <![CDATA[<b>最好的侦探小说!</b>]]>
        <name>福尔摩斯探案集</name>
        <author>柯南·道尔</author>
        <price>100</price>
    </book>

    <!-- 这里是注释 -->
    <book id="2">
        <name>解忧杂货店</name>
        <author>东野圭吾</author>
        <price>27.2</price>
    </book>

    <book id="3">
        <name>小王子</name>
        <author>安托万</author>
        <price>19.2</price>
    </book>
</books>

4、文档组成

XML声明

version:指定XML版本,属性值只有1.0
encoding:指定的字符集。告诉解析器使用什么字符集进行解码

CDATA区

当一些内容不希望XML解析器解析时,可以写在CDATA区中
格式:

<![CDATA[内容]]>

5、XML解析

概念

XML解析是指通过解析器读取XML文档,解释语法,并将文档转化为对象
Java平台同时提供了DOM和SAX两种解析技术

DOM

DOM(Document Object Model)
⑴ 需要一次性将整个XML文档加载到内存中,速度较慢
⑵ 将XML转换为DOM树后,因为DOM树常驻内存,可以重复访问
⑶ 内存占用较大
⑷ 可以读取,也可以修改
⑸ 完全面向对象的解析方式,使用方便

SAX

SAX(Simple API for XML)
⑴ 顺序解析XML,不会将整个XML文档都加载到内存中。速度快
⑵ 已经解析过的XML文档,如果没有保存,将不能获得。除非重新解析
⑶ 内存占用低
⑷ 只能读取,不能修改
⑸ 通过事件的回调函数解析XML,略复杂

DOM和SAX

6、dom4j

概念

dom4j,是一个非常优秀的Java XML API,功能强大,使用方便
使用dom4j开发,需要导入dom4j-1.6.1.jar包

⑴ 解析XML

① 创建解析器对象
② 解析XML,获取Document对象
③ 获取根元素
④ 根据子元素的属性,位置来获取对应的元素

相关方法

public SAXReader() {}
创建解析器对象

public Document read(String systemId) throws DocumentException {}
获取Document对象。需要将XML的路径传入

Element getRootElement();
获取根元素

List elements(String name);
根据标签名,获取多个子元素

String attributeValue(String name);
根据属性名,获取属性值

Element element(String name);
根据标签名,获取单个子元素

String getText();
获取元素的内容

String elementText(String name);
根据标签名,获取元素的内容

使用示例

【Book】
首先需要封装一个JaveBean。属性值String类型,对应XML中的Book的子元素名。提供有参构造,并重写toString方法

【测试类】

import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.test.bean.Book;

public class Dom4JTest {

    public static void main(String[] args) throws DocumentException {
        // 创建解析器对象
        SAXReader reader = new SAXReader();
        // 获取Document对象
        Document document = reader.read("books.xml");
        // 获取根元素
        Element rootEle = document.getRootElement();

        // 根据标签名,获取多个子元素
        List<Element> childEles = rootEle.elements("book");
        int size = childEles.size();
        for (int i = 0; i < size; i++) {
            Element childEle = childEles.get(i);

            // 获取属性值
            String id = childEle.attributeValue("id");
            // System.out.println(id);

            // 根据标签名,获取单个子元素
            Element nameEle = childEle.element("name");
            // 获取元素的内容
            String name = nameEle.getText();
            // System.out.println(name);

            // 根据标签名,获取元素的内容
            String author = childEle.elementText("author");
            // System.out.println(author);

            String price = childEle.elementText("price");
            // System.out.println(price);

            // 将每个属性值封装到JavaBean的实例中
            Book book = new Book(id, name, author, price);
            // 打印该对象
            System.out.println(book);
        }

    }

}

⑵ 新建XML

① 新建一个XML格式
② 创建XMLWriter对象
③ 创建Document对象
④ 添加一个一个的元素
⑤ 将元素写到文件中
⑥ 关闭XMLWriter流

相关方法

public static OutputFormat createPrettyPrint() {}
新建一个良好的XML格式。静态方法,通过OutputFormat来调用
Tips:通过该方法创建的XML格式,会将每个元素分行,并且上下级元素会有2个空格的缩进

public XMLWriter(OutputStream out, OutputFormat format)
throws UnsupportedEncodingException {}
创建一个XMLWriter对象,用于输出XML。第一个参数OutputStream为一个输出流,第二个参数OutputFormat即创建的XML格式

public static Document createDocument() {}
创建Document对象。静态方法,通过DocumentHelper来调用

Element addElement(String name);
添加子元素。通过Document或Element对象来调用

Element addAttribute(String name, String value);
给元素添加属性

Element addText(String text);
给元素添加内容

public void write(Document doc) throws IOException {}
将Document对象写入到文件中。通过XMLWriter对象,只需传入Document对象,即可将Document对象里的所有子元素都输出到文件中

public void close() throws IOException {}
关闭输出流。通过XMLWriter对象来调用

使用示例

【测试类】

    // 创建良好的XML风格
    OutputFormat format = OutputFormat.createPrettyPrint();
    // 创建XMLWriter对象
    XMLWriter writer = new XMLWriter(new FileOutputStream("test.xml"), format);

    // 创建Document对象
    Document document = DocumentHelper.createDocument();

    // 创建根元素
    Element rootEle = document.addElement("persons");

    // 创建一个子元素
    Element p1 = rootEle.addElement("person");
    // 添加属性
    p1.addAttribute("id", "1");
    // 添加子元素的子节点
    Element name1Ele = p1.addElement("name");
    // 添加元素内容
    name1Ele.addText("张三");
    Element age1Ele = p1.addElement("age");
    age1Ele.addText("14");

    // 创建另一个子元素
    Element p2 = rootEle.addElement("person");
    p2.addAttribute("id", "2");
    Element name2Ele = p2.addElement("name");
    name2Ele.addText("李四");
    Element age2Ele = p2.addElement("age");
    age2Ele.addText("16");

    // 将所有的元素写入到文件中
    writer.write(document);
    // 关闭流
    writer.close();

【输出结果】

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

<persons>
  <person id="1">
    <name>张三</name>
    <age>14</age>
  </person>
  <person id="2">
    <name>李四</name>
    <age>16</age>
  </person>
</persons>

7、XPath

概念

XPath是在XML文档中查找信息的语言。其通过元素和属性进行查找,是W3C组织发布的标准
使用XPath,需要导入jaxen-1.1-beta-6.jar包

语法

⑴ 绝对定位

/标签名

示例:/books/book
选择books的所有book子元素

⑵ 相对定位

//标签名

示例://book
选择所有的book元素

⑶ 查找有属性的元素

//标签名[@属性名]

示例://book[@id]
选择所有的有id属性的book元素

⑷ 查找特定的属性值的元素

//标签名[@属性名='属性值']

示例://book[@id=’1’]
选择id等于1的book元素

在dom4j中使用XPath

⑴ 导入jar包
⑵ 调用相关的方法

相关方法

List selectNodes(String xpathExpression);
选择符合条件的所有的元素。返回一个保存了所有的Node对象的List集合

Node selectSingleNode(String xpathExpression);
选择符合条件的单个元素。返回一个Node对象

Tips:Node是Element的祖先
Node和Element的关系

所以可以将得到的Node对象,向下转型为Element对象,以便调用Element的方法

使用示例

【测试类】

import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class XPathTest {

    public static void main(String[] args) throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read("books.xml");
        List<Node> selectNodes = document.selectNodes("/books/book");
        System.out.println("/books/book 选择的:" + selectNodes.size() + "个");

        selectNodes = document.selectNodes("//book");
        System.out.println("//book 选择的:" + selectNodes.size() + "个");

        selectNodes = document.selectNodes("//book[@id]");
        System.out.println("//book[@id] 选择的:" + selectNodes.size() + "个");

        Element idEle = (Element) document.selectSingleNode("//book[@id='1']");
        String name = idEle.elementText("name");
        System.out.println(name);
    }

}

【输出结果】

/books/book 选择的:3个
//book 选择的:3个
//book[@id] 选择的:3个
福尔摩斯探案集
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值