xml解析方式

XML的解析

* 通过解析技术完成XML增删改查。
* 常用的XML的解析的技术有哪些(DOM解析和SAX解析的区别)?
    * 常用的XML的解析的技术有两种,一种就是DOM和SAX解析。
    * DOM和SAX的区别:
        * DOM方式加载XML文档到内存中,形成树状结构。
            * 缺点:如果文档过大,容易产生内存溢出的问题。
            * 优点:可以做增删改的操作。
        * SAX基于事件驱动的解析,边读边解析。
            * 优点:不会产生内存溢出的问题。
            * 缺点:不能做增删改的操作,查询速度比较快。

* 这些公司都支持DOM和SAX的解析,提供了开发包。
    * SUN公司     提供了JAXP的解析(都支持DOM和SAX)
    * DOM4J公司       提供了DOM4J包,解析XML(支持DOM和SAX)(必须会的)
    * JDOM公司        提供了JDOM包,解析XML(支持DOM和SAX)(了解)

JAXP解析XML

* 快速入门的步骤
    * 1. 先获取解析器工厂类
    * 2. 通过工厂类获取解析器对象
    * 3. 来进行解析XML的文档了,返回Document对象
    * 4. 通过Document对象的api来完成某些操作

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<书架>
    <书 出版社="清华出版社">
        <书名>Java基础</书名>
        <作者>哈哈</作者>
        <售价>998</售价>
        <简介>这书不错啊</简介>
    </书>
    <书>
        <书名>JavaWeb开发大全</书名>
        <作者>呵呵</作者>
        <售价>99.8元</售价>
        <简介>这书真不错啊</简介>
    </书>
</书架>

xml文件

查询指定节点的文本内容

    public static void run1() throws Exception{
        /**
         * 0.先获取解析器的工厂类
         * 1.获取DOM方式解析器对象(DocumentBuilder)
         *         1.1 通过解析器的工厂类来获取解析器对象
         * 2.解析XML的文档(parse()),返回的Document对象
         * 3.获取作者的节点,返回NodeList
         * 4.循环遍历,拿到每一个Node对象
         * 5.获取文本内容
         */
        // 获取解析器工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 获取解析的对象
        DocumentBuilder builder = factory.newDocumentBuilder();
        // 解析book2.xml的文档
        Document document = builder.parse("src/book2.xml");
        // 获取作者的节点
        NodeList nodeList = document.getElementsByTagName("作者");
        // 循环遍历
        for(int i=0;i<nodeList.getLength();i++){
            // 循环一次,获取作者的标签
            Node node = nodeList.item(i);
            // 打印节点的文本内容
            System.out.println(node.getTextContent());
        }
    }

案例

添加子节点

/**
 * 1.工厂
 * 2.解析器
 * 3.解析 获取document对象
 * 4.创建元素对象(团购价)
 * 5.设置的文本内容
 * 6.把元素对象添加到书的节点的下面
 *      6.1获取第一步书
 */
// 工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 解析器对象
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析
Document document = builder.parse("src/book2.xml");
// 创建团购价的元素对象
Element tgj = document.createElement("团购价");
// 设置文本的内容
tgj.setTextContent("9两");
// 获取第一本书
Node book1 = document.getElementsByTagName("书").item(0);
// 把团购价添加到第一本书下
book1.appendChild(tgj);

// 回写
// 先获取回写了的工厂类
TransformerFactory transformerFactory = TransformerFactory.newInstance();
// 可以获取回写的类
Transformer transformer = transformerFactory.newTransformer();
// 调用tranform(document,XML文件)来进行回写
transformer.transform(new DOMSource(document), new StreamResult("src/book2.xml"));

删除节点
// 工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 解析器对象
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析
Document document = builder.parse("src/book2.xml");
// 先获取团购价的节点
Node tgj = document.getElementsByTagName("团购价").item(0);
// 获取团购价的父节点
Node book1 = tgj.getParentNode();
// 使用书的删除团购价的节点
book1.removeChild(tgj);

// 回写
// 获取回写的工厂类
TransformerFactory transformerFactory = TransformerFactory.newInstance();
// 获取回写的类
Transformer transformer = transformerFactory.newTransformer();
// 回写
transformer.transform(new DOMSource(document), new StreamResult("src/book2.xml"));  

添加

更新节点的文本

// 工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 解析器对象
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析
Document document = builder.parse("src/book2.xml");
// 获取第二个作者
Node author2 = document.getElementsByTagName("作者").item(1);
// 设置文本内容
author2.setTextContent("班主任");
// 回写
// 获取回写的工厂类
TransformerFactory transformerFactory = TransformerFactory.newInstance();
// 获取回写的类
Transformer transformer = transformerFactory.newTransformer();
// 回写
transformer.transform(new DOMSource(document), new StreamResult("src/book2.xml"));

修改

回写

* 获取TransformerFactory类获取Transformer类。
* Transformer类中有一个方法:transform(数据源(document),目的地(XML的文档))来完成回写的操作。(在上面代码中有具体操作)

XML的解析 JAXP的SAX解析

* JAXP的SAX解析:边读边解析,事件驱动。只能做查询,不能做增删改的操作。
* SAX解析两个概念
    * 解析器
    * 事件处理器

/**
 * 自己定义的事件处理器
 * @author Administrator
 *
 */
class MyHandler extends DefaultHandler{

    /**
     * 如果解析是开始标签,默认调用该方法
     */
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // 获取到解析的内容
        System.out.println("开始标签:"+qName);
    }

    /**
     * 如果解析的标签的文本内容,默认调用该方法
     */
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        String str = new String(ch,start,length);
        System.out.println(str);
    }

    /**
     * 如果解析的结束标签,默认调用该方法
     */
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        System.out.println("结束标签:"+qName);
    }
}

事件处理器

想获取指定元素的文本内容

class MyHandler2 extends DefaultHandler{

    private boolean flag = false;
    private int count = 0;

    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // 说明刚好解析到作者的标签
        if("作者".equals(qName)){
            flag = true;
            count++;
        }
    }

    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if(flag && count == 1){
            // 解析作者标签的时候打印文本的内容
            System.out.println(new String(ch,start,length));
        }
    }

    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        flag = false;
    }
}

案例

XML的解析 DOM4J的解析(重点)

* 不是SUN提供的,第三方提供的jar包。
* dom4j-1.6.1.jar必须要有的。必须导入工程中。
    * 如果是WEB项目 -- 复制jar包 -- WebRoot -- WEB-INF -- lib
    * 创建一个文件夹

查询节点的文本内容

* 第一步:先导入jar包(dom4j-1.6.1.jar)。
* 第二步:编写代码
    * 2.1 创建解析器的对象
    * 2.2 解析XML的文档,返回Document对象(导包不要导错了)
    * 2.3 先获取根节点    getRootElement();
    * 2.4 看需求

DOM4J支持XPATH语言

* 通过XPATH语言非常方便查询XML的节点
* 如果直接DOM4J完成解析的工作,必须要先获取根节点。如果使用XPATH,通过查询方式来准确获取内容。

* 导入jaxen-1.1-beta-6.jar
* selectNodes(XPATH语法)          返回的内容是集合,泛型Node对象
* selectSingleNode(XPATH语法) 返回的内容一个Node对象

语法
    * /AAA/BBB          从根节点开始的,一层一层去解析 selectNodes("/书架/书")    ==  getRootElment()
    * //AAA             无论层级关系                  selectNodes("//作者")
    * /AAA/BBB/*        任意的元素
    * [1]或者[last()] 或者相同的子节点的第一个或者最后一个      selectSingleNode("/书架/书[last()]")
                                                            错误的:selectSingleNode("//作者[1]")
    * 

package cn.itcast.dom4j;

import java.io.FileOutputStream;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * DOM4J的练习
 * @author Administrator
 *
 */
public class Dom4jTest {

    public static void main(String[] args) {
        try {
            run6();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 对象XPATH进行测试
     * @throws Exception
     */
    public static void run6() throws Exception{
        // 创建解析器对象
        SAXReader reader = new SAXReader();
        // 解析XML的文件
        Document document = reader.read("src/book2.xml");
        // 下一步获取根节点(省略)
        // List<Node> nodeList = document.selectNodes("/书架/书/作者");
        /*List<Node> nodeList = document.selectNodes("//作者");
        for (Node node : nodeList) {
            System.out.println(node.getText());
        }*/

        // 获取一个作者
        Node author2 = document.selectSingleNode("/书架/书[last()]/作者");
        System.out.println(author2.getText());
    }

    /**
     * 修改指定节点的名称
     * 修改第二个作者的文本内容
     * @throws Exception
     */
    public static void run5() throws Exception{
        // 创建解析器对象
        SAXReader reader = new SAXReader();
        // 解析XML的文件
        Document document = reader.read("src/book2.xml");
        // 先获取根节点
        Element root = document.getRootElement();
        // 获取第二本
        Element book2 = (Element) root.elements("书").get(1);
        // 获取作者的节点
        book2.element("作者").setText("班长");
        // 回写
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter writer = new XMLWriter(new FileOutputStream("src/book2.xml"),format);
        // 写
        writer.write(document);
        // 关闭流
        writer.close();
    }

    /**
     * 删除团购价的节点
     * @throws Exception
     */
    public static void run4() throws Exception{
        // 创建解析器对象
        SAXReader reader = new SAXReader();
        // 解析XML的文件
        Document document = reader.read("src/book2.xml");
        // 先获取根节点
        Element root = document.getRootElement();
        // 获取第一本书
        Element book1 = root.element("书");
        // 获取团购价的节点
        Element tgj = book1.element("团购价");
        // 删除
        book1.remove(tgj);
        // 回写
        // 回写
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter writer = new XMLWriter(new FileOutputStream("src/book2.xml"),format);
        // 写
        writer.write(document);
        // 关闭流
        writer.close();
    }

    /**
     * 在指定的位置添加子节点
     * 在第一本书的作者节点之前添加子节点
     * @throws Exception
     */
    public static void run3() throws Exception{
        // 创建解析器对象
        SAXReader reader = new SAXReader();
        // 解析XML的文件
        Document document = reader.read("src/book2.xml");
        // 先获取根节点
        Element root = document.getRootElement();
        // 获取第一本书
        Element book1 = root.element("书");
        // 获取第一本书下的所有子节点
        List<Element> bookChilds = book1.elements();
        // 创建元素对象
        Element tgj = DocumentHelper.createElement("团购价");
        // 设置文本内容
        tgj.setText("9两");
        // 添加一个节点
        bookChilds.add(1, tgj);

        // 回写
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter writer = new XMLWriter(new FileOutputStream("src/book2.xml"),format);
        // 写
        writer.write(document);
        // 关闭流
        writer.close();
    }

    /**
     * 查询作者标签的文本内容
     * @throws Exception
     */
    public static void run1() throws Exception{
        // 创建解析器对象
        SAXReader reader = new SAXReader();
        // 解析XML的文件
        Document document = reader.read("src/book2.xml");
        // 先获取根节点
        Element root = document.getRootElement();
        // 获取书的节点
        List<Element> books = root.elements("书");
        // 循环遍历
        for (Element book : books) {
            // 循环第一次,获取第一本书
            Element author = book.element("作者");
            // 获取节点的文本内容
            System.out.println(author.getText());
        }
    }

    /**
     * 添加子节点
     * 在第一本书的节点下去添加团购价的节点
     */
    public static void run2() throws Exception{
        // 解析器对象
        SAXReader reader = new SAXReader();
        // 解析
        Document document = reader.read("src/book2.xml");
        // 获取根节点
        Element root = document.getRootElement();
        // 获取第一本书
        Element book1 = root.element("书");
        // 直接在第一本书下去添加子节点(设置文本的内容)
        Element tgj = book1.addElement("团购价");
        tgj.setText("9两");

        // 回写
        // 创建输出的格式
        OutputFormat format = OutputFormat.createPrettyPrint();
        //OutputFormat format = OutputFormat.createCompactFormat();
        XMLWriter writer = new XMLWriter(new FileOutputStream("src/book2.xml"),format);
        // 把内存中Docuemnt写到XML文件中
        writer.write(document);
        // 关闭流
        writer.close();
    }

}

案例

时间: 2024-12-15 12:47:23

xml解析方式的相关文章

几种常见的xml解析方式 SAX,DOM,PULL以android为例

准备工作 首先是一个person.xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <person id="18"> <name>allen</name> <age>36</age> </person> <person id="28"> <name>

Android中的三种XML解析方式

在Android中提供了三种解析XML的方式:SAX(Simple API XML),DOM(Document Objrect Model),以及Android推荐的Pull解析方式.下面就对三种解析方式一一详细阐述. 假设要要解析person.xml文档 <?xml version="1.0" encoding="UTF-8"?><persons>  <person id="1">    <name&g

java xml解析方式(DOM、SAX、JDOM、DOM4J)

XML值可扩展标记语言,是用来传输和存储数据的. XMl的特定: XMl文档必须包含根元素.该元素是所有其他元素的父元素.XML文档中的元素形成了一颗文档树,树中的每个元素都可存在子元素. 所有XML元素都必须有关闭标签. XML标签对大小写敏感,并且所有属性值date都需加引号. XML元素: XMl元素是只从包括开始标签到结束标签的部分,元素可包含其他元素.文本或两者都包含,也可拥有属性. XML解析 基础方法:DOM.SAX DOM解析:平台无关的官方解析方式 SAX解析:Java中基于事

XML解析方式与解析工具

DOM解析原理: 1)JAXP (oracle-Sun公司官方) 2)JDOM工具(非官方) 3)Dom4J工具(非官方) 三大框架(默认读取xml的工具就是Dom4j) ....... SAX解析原理: 1)Sax解析工具(oracle-sun公司官方) Dom4j工具,非官方,不在jdk中. 需要导入dom4j的核心包. 如:dom4j-1.6.1.jar 简单运用: public static void main(String[] args) { try { //1.创建一个xml解析器对

【Java技术点滴】——XML解析方式比较

为什么? "它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据.是Internet环境中跨平台的.依赖于内容的技术,也是当今处理分布式结构信息的有效工具."XML被设计用来传输和存储数据: 他的平台无关性.语言无关性.系统无关性,给数据继承与交互带来了极大的方便.也因此使用XML的地方越来越常见. 方式 1.DOM--DocumentObject Model 像操作HTML

Xml解析方式之Pull解析器的使用

xml有多种解析的方式,这篇文章只介绍用pull解析器来解析XML文件,接下来我会说明使用Pull解析器来读取Xml文件内容和新建Xml文件. 读取Xml文件的内容 我在项目中已经添加了一个Xml文件,"data.xml",下面是Xml文件里面的内容. <?xml version="1.0" encoding = "utf-8"?> <persons> <person id = "23">

带URL的XML解析方式

XmlDocument xml = new XmlDocument(); xml.LoadXml(responseString); XmlNode root = xml.DocumentElement; XmlNamespaceManager nsp = new XmlNamespaceManager(xml.NameTable); nsp.AddNamespace("soapenv", "http://schemas.xmlsoap.org/soap/envelope/&q

XML基础+Java解析XML +几种解析方式的性能比较

XML基础+Java解析XML 一:XML基础 XML是什么: 可扩展的标记语言 XML能干什么: 描述数据.存储数据.传输(交换)数据. XML与HTML区别: 目的不一样 XML 被设计用来描述数据,其焦点是数据的内容. HTML 被设计用来展示数据,其焦点是数据的外观. HTML可以不关闭标签(即标签可以不成对出现),但XML必须关闭标签(即标签必须成对出现). HTML中的标签标识文本如何展示,而XML中的标签标识文本是什么含义(什么类型的文本). XML文档节点类型 u     文档(

Android] Android XML解析学习——方式比较

[Android] Android XML解析学习——方式比较 (ZT) 分类: 嵌入式 (From:http://blog.csdn.net/ichliebephone/article/details/5981913) 一.基础知识 经过这段时间的学习,我们已经了解了Android平台上用于解析XML的三种方式:SAX.DOM和Pull.并且在学习的过程中也介绍了这三种方式各自的特点及适合的使用场合,简单的来说,DOM方式最直观和容易理解,但是只适合XML文档较小的时候使用,而SAX方式更适合