XML

来源:互联网 发布:jamp软件的作用 编辑:程序博客网 时间:2024/06/01 07:44

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个福尔摩斯探案集
原创粉丝点击