文章目录

  • 一、什么是XML?
  • 二、XML的优势
  • (一)、XML的特性
  • 1、XML具有平台无关性
  • 2、XML具有自我描述性
  • (二)、XML的用处
  • 1、网络数据传输
  • 2、 数据存储
  • 3、配置文件(最常用)
  • 三、XML的语法格式
  • (一)、XML文档声明
  • (二)、一个XML文档中有且且仅允许有一个根标记
  • (三)、标记名称命名规范
  • (四)、含有属性的XML标记案例
  • (五)、注释
  • (六)、CDATA
  • 四、4种解析方式
  • (一)、SAX解析
  • 1、优点
  • 2、缺点
  • (二)、DOM解析
  • 1、优点
  • 2、缺点
  • (三)、JDOM解析
  • (四)、DOM4J解析
  • 五、DOM4J解析本地XML文件示例
  • 六、使用DOM4J-XPATH解析网络编程中的XML文件
  • XPATH路径表达式


一、什么是XML?

XML是一种可扩展标记语言,是一种软件与软件之间交流的语言。XML文件是保存XML数据的一种方式 ,XML数据也可以以其他的方式存在(如在内存中以字符串类型承载XML数据),将XML语言狭隘的理解成XML文件是不合理的。

二、XML的优势

(一)、XML的特性

1、XML具有平台无关性

XML是一种独立于各大语言的文档格式规范,作为一门独立的标记语言,与运行的平台无关。

2、XML具有自我描述性

XML有一套自己的语法格式来封装其所承载的文本内容信息。

(二)、XML的用处

1、网络数据传输

用于CS/BS网络传输模型中的数据传输。

2、 数据存储

用于将数据按一定格式封装后保存在本地。

3、配置文件(最常用)

XML提供了一种树形层次结构,其作为配置文件可以很方便的定位某一功能块。

三、XML的语法格式

(一)、XML文档声明

?xml version=“1.0” encoding=“UTF-8”?>

(二)、一个XML文档中有且且仅允许有一个根标记

<names>                
            	<name>张三</name>                
            	<name>李四</name>            
            </names>

(三)、标记名称命名规范


1、名称可以含字母、数字以及其他的字符;

2、名称不能以数字或者标点符号开始;

3、名称不能以字符 “xml”(或者 XML、Xml)开始;

4、名称不能包含空格,不能包含冒号(:);

5、名称区分大小写。


(四)、含有属性的XML标记案例

<persons>                
 	<person id="10001" groupid="1">                    
 		<name>李四</name>                    
 		<age>18</age>                
 	</person>                
 	<person id="10002" groupid="1">                    
 		<name>李四</name>                    
 		<age>20</age>                
 	</person>            
 </persons>

(五)、注释


1、 注释不能写在文档文档声明前;

2、注释不能嵌套注释;

3、格式:

注释开始:: < !--

注释结束:: -- >

(六)、CDATA

在某些文本,比如 JavaScript 代码,包含大量 “<” 或 “&” 字符。为了避免错误,可以将脚本代码定义为CDATA格式来避免被解析器误解析。

CDATA格式:
CDATA部分由 “<![CDATA[" 开始,由 "]]>” 结束。
例如:<![CDATA[haa>ha]]>

四、4种解析方式

(一)、SAX解析

解析方式是事件驱动机制。SAX解析器, 逐行读取XML文件解析 , 每当解析到一个标签的开始/结束/内容/属性时,触发事件,我们可以编写程序在这些事件发生时, 进行相应的处理。

1、优点

1、分析能够立即开始,而不是等待所有的数据被处理;
2、逐行加载,节省内存,有助于解析大于系统内存的文档 ;
3、有时不必解析整个文档,它可以在某个条件得到满足时停止解析。

2、缺点

1、单向解析,无法定位文档层次,无法同时访问同一文档的不同部分数据(因为逐 行解析, 当解析第n行是, 第n-1行已经被释放了, 无法在进行操作了);
2、无法得知事件发生时元素的层次, 只能自己维护节点的父/子关系;
3、只读解析方式, 无法修改XML文档的内容。

(二)、DOM解析

该结构通常需要加载整个文档和内存中建立文档树模型,程序员可以通过操作文档树, 来完成数据的获取、修改、删除等。

1、优点

1、文档在内存中加载, 允许对数据和结构做出更改;
2、访问是双向的,可以在任何时候在树中双向解析数据。

2、缺点

文档全部加载在内存中,消耗资源大。

(三)、JDOM解析

简化了与XML的交互并且比使用DOM实现更快,由于是第一个Java特定模型,JDOM一直得到大力推广和促进。
其使用具体类而不是接口,简化了DOM的API。并大量使用了Java集合类,方便了Java开发人员调用。

(四)、DOM4J解析

是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath 支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML,目前许多开源项目中大量采用DOM4J , 例如:Hibernate。

五、DOM4J解析本地XML文件示例

public class Demo {
    /**
     * DOM4J解析一个本地的XML文件
     */
    public static void main(String[] args) throws IOException, DocumentException {
        //1.    获取输入流
        FileInputStream fis = new FileInputStream("c://Demo1.xml");
        //2.    创建XML读取对象
        SAXReader sr = new SAXReader();
        //3.    读取并得到文档对象
        Document doc = sr.read(fis);
        //4.    通过文档获取元素
        Element root = doc.getRootElement();
        //5.    开始解析元素
        System.out.println(root.getName());
        fis.close();

        //6. 操作一波
/*        Element book = root.element("book");
        Element name = book.element("name");
        System.out.println(name.getText());*/

        List<Element> es = root.elements();
        for(int i=0;i<es.size();i++){
            Element book = es.get(i);
            System.out.println(book.attributeValue("id"));
            System.out.println(book.elementText("name"));
            System.out.println(book.elementText("info"));
            System.out.println("----------------------------------");
        }
    }
}

六、使用DOM4J-XPATH解析网络编程中的XML文件

XPATH路径表达式


1、 / : 从根节点开始查找

2、 // : 从发起查找的节点位置 查找后代节点 ***

3、 . : 查找当前节点

4、 .. : 查找父节点

5、@ : 选择属性. *

属性使用方:

[@属性名='值']

[@属性名>'值']

[@属性名<'值']

[@属性名!='值']


public class Demo4 {
    /**
     * 通过XPATH解析网络传输的XML
     * @param args
     * @throws IOException
     * @throws DocumentException
     */
    public static void main(String[] args) throws IOException, DocumentException {
        String phone = "18313935565";
        //1.    获取到XML资源的输入流
        URL url = new URL("http://apis.juhe.cn/mobile/get?phone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
        URLConnection conn = url.openConnection();
        InputStream is = conn.getInputStream();
        //2.    创建一个XML读取对象
        SAXReader sr = new SAXReader();
        //3.    通过读取对象 读取XML数据,并返回文档对象
        Document doc = sr.read(is);

        Node node = doc.selectSingleNode("//company");
        System.out.println("运营商:"+node.getText());
        is.close();
    }
}