文章目录
- 一、什么是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();
}
}