XML的打包与解析

一、XML语言的特点
       1、XML独立于任何编程语言,允许人们按接收者容易解析的方式,对复杂数据进行编码。先来看一个简单的XML格式的文件:

[XML] 纯文本查看 复制代码
1
2
3
4
5
6
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

对于程序员来说,很容易读懂这是什么意思,很明显这是传递给他人的一个便签,如果我们写出下面这样:
George
John
Reminder
Don't forget the meeting!
虽然最终从XML中提取出来就是上面的内容,但是我们从上面的内容根本看不出这是什么。

2、数据做成XML有助于改变其内容
如果我们现在想再添加一项:时间。在XML中我们可以这样:

[XML] 纯文本查看 复制代码
1
2
3
4
5
6
7
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
<time>2012-12-03</time>
</note>

在我们解析的时候,只要从对应的标签“time”找就行,非常方便!这样的特点,有助于组织复杂的数据。

3、XML 与 HTML 的主要差异
XML 不是 HTML 的替代,XML 和 HTML 为不同的目的而设计,XML 被设计为传输和存储数据,其焦点是数据的内容。HTML 被设计用来显示数据,其焦点是数据的外观。HTML 旨在显示信息,而 XML 旨在传输信息。HTML的标记不是所有的都需要成对出现,XML则要求所有的标记必须成对出现,HTML标记不区分大小写,XML则 大小敏感,即区分大小写。

4、上图表示下面的 XML 中的一本书:

[XML] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<bookstore>
<book category="COOKING">
  <title lang="en">Everyday Italian</title>
   <author>Giada De Laurentiis</author>
   <year>2005</year>
   <price>30.00</price>
 </book><book category="CHILDREN">
  <title lang="en">Harry Potter</title>
   <author>J K. Rowling</author>
   <year>2005</year>
   <price>29.99</price>
 </book><book category="WEB">
  <title lang="en">Learning XML</title>
   <author>Erik T. Ray</author>
   <year>2003</year>
   <price>39.95</price>
 </book>
</bookstore>

二、XML的解析技术
1、大名鼎鼎的DOM技术
      说它大名鼎鼎可是一点不为过,DOM 是 W3C 处理 XML 的标准 API,它是许多其它与 XML 处理相关的标准的基础,不仅是 Java,其它诸如 Javascript,PHP,MS .NET 等等语言都实现了该标准, 成为了应用最为广泛的 XML 处理方式。当然,为了能提供更多更加强大的功能,Java 对于 DOM 直接扩展工具类有很多,比如很多 Java 程序员耳熟能详的 JDOM,DOM4J 等等, 它们基本上属于对 DOM 接口功能的扩充,保留了很多 DOM API 的特性,许多原本的 DOM
程序员甚至都没有任何障碍就熟练掌握了另外两者的使用,直观、易于操作的方式使它深受广大 Java 程序员的喜爱。

2、绿色环保的 SAX
       SAX 的应运而生有它特殊的需要,为什么说它绿色环保呢,这是因为 SAX 使用了最少的系统资源和最快速的解析方式对 XML 处理提供了支持。 但随之而来繁琐的查找方式也给广大程序员带来许多困扰,常常令人头痛不已,同时它对 XPath 查询功能的支持,令人们对它又爱又恨。

二种技术的比较:
DOM
优缺点:实现 W3C 标准,有多种编程语言支持这种解析方式,并且这种方法本身操作上简单快捷,十分易于初学者掌握。其处理方式是将 XML 整个作为类似树结构的方式读入内存中以便操作及解析,因此支持应用程序对 XML 数据的内容和结构进行修改,但是同时由于其需要在处理开始时将整个 XML 文件读入到内存中去进行分析,因此其在解析大数据量的 XML 文件时会遇到类似于内存泄露以及程序崩溃的风险,请对这点多加注意。
适用范围:小型 XML 文件解析、需要全解析或者大部分解析 XML、需要修改 XML 树内容以生成自己的对象模型
SAX
SAX 从根本上解决了 DOM 在解析 XML 文档时产生的占用大量资源的问题。其实现是通过类似于流解析的技术,通读整个 XML 文档树,通过事件处理器来响应程序员对于 XML 数据解析的需求。由于其不需要将整个 XML 文档读入内存当中,它对系统资源的节省是十分显而易见的,它在一些需要处理大型 XML 文档以及性能要求较高的场合有起了十分重要的作用。支持 XPath 查询的 SAX 使得开发人员更加灵活,处理起 XML 来更加的得心应手。但是同时,其仍然有一些不足之处也困扰广大的开发人员:首先是它十分复杂的
API 接口令人望而生畏,其次由于其是属于类似流解析的文件扫描方式,因此不支持应用程序对于 XML 树内容结构等的修改,可能会有不便之处。 
适用范围:大型 XML 文件解析、只需要部分解析或者只想取得部分 XML 树内容、有 XPath 查询需求、有自己生成特定 XML 树对象模型的需求

三、实例运用
首先造一个xml文档出来:(books.xml放在项目根路径下,不是src)

[XML] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
<?xml version="1.0" encoding="UTF-8"?>
  <books>
    <book id="01" name="book1">
       <title>Harry Potter</title>
       <author>J K. Rowling</author>
    </book>
    <book id="02" name="book2">
      <title>Thinking in Java</title>
      <author>Bruke</author>
   </book>
  </books>

使用DOM进行解析:

[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/** * the DOM Parser Example
 * @author egg
  * email:xtfggef@gmail.com
  * microblog:http://weibo.com/xtfggef
*/
public class DOMTest {
    /* build a DocumentBuilderFactory */
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory
            .newInstance();
    public static void main(String[] args) {
        DOMTest parser = new DOMTest();
        Document document = parser.parse("books.xml");
        /* get root element */
        Element rootElement = document.getDocumentElement();
        /* get all the nodes whose name is book */
        NodeList nodeList = rootElement.getElementsByTagName("book");
        if (nodeList != null) {
            for (int i = 0; i < nodeList.getLength(); i++) {
                /* get every node */
                Node node = nodeList.item(i);
                /* get the next lever's ChildNodes */
                NodeList nodeList2 = node.getChildNodes();
                for (int j = 0; j < nodeList2.getLength(); j++) {
                    Node node2 = nodeList2.item(j);
                    if (node2.hasChildNodes()) {
                        System.out.println(node2.getNodeName() + ":"
                                + node2.getFirstChild().getNodeValue()
);
                    }
                }
            }      
}
    }
    /* Load and parse XML file into DOM */
    public Document parse(String filePath) {
        Document document = null;
        try {
            /* DOM parser instance */
            DocumentBuilder builder = builderFactory.newDocumentBuilder();
            /* parse an XML file into a DOM tree */
            document = builder.parse(new File(filePath));
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return document;
    }
}

输出:
title:Harry Potter
author:J K. Rowling
title:Thinking in Java
author:Bruke

想弄懂xml的解析,需要先清楚几个概念:节点、属性,如下图:
这样结合上面的例子就容易理解了,给一个例子,大家自己去练习下:

[XML] 纯文本查看 复制代码
1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8"?>
 <books>
   <name>Think in C++</name>
   <price>100</price>
   <author>brucl</author>
 </books>

使用SAX进行解析:

[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public class SAXTest {
    class BookHandler extends DefaultHandler {
        private List<String> nameList;
        private boolean title = false;
        public List<String> getNameList() {
            return nameList;
        }
        // Called at start of an XML document
        @Override
        public void startDocument() throws SAXException {
            System.out.println("Start parsing document...");
            nameList = new ArrayList<String>();
        }
        // Called at end of an XML document
        @Override
        public void endDocument() throws SAXException {
            System.out.println("End");
        }
        @Override
        public void startElement(String uri, String localName, String qName,
                Attributes atts) throws SAXException {
            // Using qualified name because we are not using xmlns prefixes
            // here.
            if (qName.equals("title")) {
                title = true;
            }
        }
        @Override
        public void endElement(String namespaceURI, String localName,
                String qName) throws SAXException {
            // End of processing current element
            if (title) {
                title = false;
            }
        }
        @Override
        public void characters(char[] ch, int start, int length) {
            // Processing character data inside an element
            if (title) {
                String bookTitle = new String(ch, start, length);
                System.out.println("Book title: " + bookTitle);
                nameList.add(bookTitle);
            }
        }
    }  
public static void main(String[] args) throws SAXException, IOException {
        XMLReader parser = XMLReaderFactory.createXMLReader();
        BookHandler bookHandler = (new SAXTest()).new BookHandler();
        parser.setContentHandler(bookHandler);
        parser.parse("books.xml");
        System.out.println(bookHandler.getNameList());
    }
}

XML的打包

[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
public class SAXGeneratorXml {
    public static void main(String[] args) {
        String outputPath = "persons.xml";
        generateXml(outputPath);
    }
    public static void generateXml(String outputPath) {
        try {
            Person[] arr = new Person[] { new Person("egg", 22),
                    new Person("niu", 21) };
            List<Person> list = Arrays.asList(arr);// 将数组转换成List
            Document doc = generateXml(list);// 生成XML文件
            outputXml(doc, outputPath);// 将文件输出到指定的路径
        } catch (Exception e) {
            System.err.println("出现异常");
        }
    }
    /** 
* 将XML文件输出到指定的路径
     * @param doc
     * @param fileName
     * @throws Exception
     */
    private static void outputXml(Document doc, String fileName)
            throws Exception {
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = tf.newTransformer();

更多技术资讯可关注:itheimaGZ获取

XML的打包与解析的更多相关文章

  1. XML.03-DOM和SAX解析

    body,td { font-family: calibri; font-size: 10pt } XML.03-DOM和SAX解析 XML的DOM解析 解析 处理 回写 XML的SAX解析 SAX和 ...

  2. 在Salesforce中处理Xml的生成与解析

    在Salesforce中处理Xml的生成与解析 1): Generate Xml private String ConvertAccountToXmlInfo(Account acc){ Dom.Do ...

  3. 10分钟掌握XML、JSON及其解析

    引言 NOKIA 有句著名的广告语:“科技以人为本”.任何技术都是为了满足人的生产生活需要而产生的.具体到小小的一个手机,里面蕴含的技术也是浩如烟海,是几千年来人类科技的结晶,单个人穷其一生也未必能掌 ...

  4. xml中俩种解析方式

    两种解析方式 1.from xml.etree import ElementTree as ET 利用ElementTree模块下的xml方法可以把一个字符串类型的东西转换成Element类,从而利用 ...

  5. iOS高级编程之XML,JSON数据解析

    解析的基本概念 所谓“解析”:从事先规定好的格式串中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据.数据获取方按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 一.X ...

  6. XML解析——Java中XML的四种解析方式

    XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四 ...

  7. Android平台中实现对XML的三种解析方式

    本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...

  8. xml常用四种解析方式优缺点的分析×××××

    xml常用四种解析方式优缺点的分析 博客分类: xml   最近用得到xml的解析方式,于是就翻了翻自己的笔记同时从网上查找了资料,自己在前人的基础上总结了下,贴出来大家分享下. 首先介绍一下xml语 ...

  9. STM32-cJSON库的打包和解析

    这几天使用了一下JSON在STM32103平台上的使用,还是很好用的,在此记录下. JSON是啥我也不总结了,就是直观的看起来是一个有格式的字符串,看起来非常清楚明白,有点像Python中的dicit ...

随机推荐

  1. node,npm,webpack,vue-cli模块化编程安装流程

    首先什么都不要管,先装环境. pip是万能的!!! 安装node: pip3 install node 安装npm:   pip3 install npm 安装webpack: npm install ...

  2. Bezier曲线的实现——de Casteljau算法

    这学期同时上了计算机图形学和计算方法两门课,学到这部分的时候突然觉得de Casteljau递推算法特别像牛顿插值,尤其递推计算步骤很像牛顿差商表. 一开始用伯恩斯坦多项式计算Bezier曲线的时候, ...

  3. 6.react 基础 - 关于 react 开发 的原则

    1. 声明式开发 通过绑定元素 在数据变更时 对元素进行动态渲染 2. 可以与其他框架并存 不在React的绑定元素内, 可以使用其他框架 如 ( vue jQuery 等 ) 进行元素操作 3. 组 ...

  4. Lambder笔记

    记录Lambda语法(λ ,匿名函数)以及三个Python常见内置函数 形如:y=f(x)=x*x 使用lambda语法将对一个变量的运算抽象出来,如同f(),或是数学中的函数.关系.映射 f = l ...

  5. share团队冲刺2

    团队冲刺第二天 昨天:在网上学习app开发的简单操作代码,实现了简单的输出界面,学会了添加按钮控件. 今天:继续昨天的进度,先进行登陆界面窗口的制作. 问题:目前只能在activity添加简单代码,复 ...

  6. MyBatis从入门到精通(第9章):Spring集成MyBatis(下)

    MyBatis从入门到精通(第9章):Spring集成MyBatis(下) springmvc执行流程原理 mybatis-spring  可以帮助我们将MyBatis代码无缝整合到Spring中.使 ...

  7. 如何判断Office是32位还是64位?

    对于持续学习VBA的老铁们,有必要了解Office的位数. 如果系统是32位的,则不需要判断Office位数了,因为只能安装32位Office. 下面只讨论64位系统中,Office的位数判断问题. ...

  8. 实现迭代器(\_\_next\_\_和\_\_iter\_\_)

    目录 实现迭代器(__next__和__iter__) 一.简单示例 二.StopIteration异常版 三.模拟range 四.斐波那契数列 实现迭代器(__next__和__iter__) 一. ...

  9. 2019深圳Android千人开发者大会【NEW·无界】

    报名地址:https://www.hdb.com/dis/mjcsegnslu 安卓巴士技术社区是中国领先的安卓开发者社区,现已聚集超过85万开发者,数年来一直致力于IT从业者的知识分享服务. 安卓巴 ...

  10. MCMC学习

    看了这个文档 结合随机矩阵的知识, 更清楚了一点. https://www.cnblogs.com/xbinworld/p/4266146.html