XML

1 XML入门

1.1 引入

HTML, 超文本标记语言。

html语言语法是很松散的!

1)标签不区分大小写的!

2)标签可以不匹配的。

w3c组织,针对html的语法缺陷,去设计了另一门,叫xml语言。

html语言的标签是固定的。

1.2 XML语言

<NAME></NAME>

XMLExtend Markup lanuage 可扩展标记语言。

       HTML                      XML

概念          超文本标记语言        可扩展标记语言

标记数量     是固定的                 是不固定的,可扩展的

作用       负责网页的结构      1描述带关系的数据结构(作为软件的配置文件)

                  properties配置文件: 键值对  name=eric   password=123456

                  xml可以描述包含与被包含的关系。

                    <student>

                      <name></name>

                      <PASSWORD></PASSWORD>

                    </student>

                    <student>

                      <name></name>

                    </student>

                  配置使用场景:

                    1)框架(struts2 hibernatespring),xml作为框架的配 置文件

                          2tomcat服务器软件配置文件(web.xml server.xml

                  2装载数据(作为小型的“数据库”)。

2 XML作用

2.1 作为软件配置文件

两台通讯条件;

  IP地址和端口

  java代码: 根据ip和端口连接数据库服务器(ip改动会改变代码)

properties文件:

  ip=211.34.21.43

  port=20

xml文件:

  <host-list>

    <host id="main">

      <ip> 211.34.21.43</ip>

      <port>20</port>

    </host>

    <host id="backup">

      <ip> 211.34.21.44</ip>

      <port>20</port>

    </host>

  </host-list>

  PC数据库服务器1oracle数据库  211.34.21.43     20

  PC数据库服务器2oracle数据库  211.34.21.44     20

2.2 作为小型数据库

教师管理系统      教师信息: 姓名  工龄  邮箱地址

传输数据:

字符串:  ||20|zhangsan@qq.com|.......|....  (格式不是行业规范的,不通用)

xml格式:

  <teacher-list>

    <teacher>

      <name></name>

      <email></email>

      <workage></workage>

      ....

    </teacher>

    <teacher>

      <name></name>

      <email></email>

      <workage></workage>

      ....

    </teacher>

  <teacher-list>              xmlw3c组织的制定的标准)

json格式  获取字符串,截取字符串数据。

3 XML语法

3.1 标签

<student>学生</student>  

 注意:

1)分带标签体的标签,也有空标签。

2)标签是区分大小写

3)标签一定要配对

4)标签名字中间不能含有空格

5)标签名字不能使用数字开头

6)在同一个xml文件中,有且仅有一个根标签

3.2 属性

<student id="1"></student>

注意:

1)一个属性分为属性名和属性值。属性名和值之间使用=号分割。

2)属性值一定要使用单引号或者双引号包含,不能省略,也不能单双混用!

3)一个标签内可以包含多个属性,但是不能出现同名的属性

3.3 注释

<!--  xml --->

3.4 文档声明

<?xml version="1.0"  encoding="码表"?>

version: xml的版本号

encoding: 表示解析xml文件内容时使用的码表

xml文件的编码问题:

1xml文件内容保存的编码(另存为-》选择编码保存)

2)解析xml文件内容的编码(   <?xml version="1.0" encoding="utf-8"?> )

以上两个编码必须保存一致,才能避免中文乱码问题。

注意:

如果在ecplise开发工具上,编写xml文件,那么xml文件内容自动按照文档声明的encoding的编码保存,所以不会中文乱码问题.

3.5 转义字符

html的转义字符.

3.6 处理指令(不用了,过时了)

<?xml-stylesheet type="text/css" href="1.css"?>

练习:

通讯录程序

联系人: 编号  姓名  性别  手机  地址  QQ

要求:

1)编写一个xml文件。(contact.xml,该文件描述联系人的信息

2)该文件可以同时描述多个联系人。

4 XML解析

4.1 xml解析方式

1DOM解析:

2SAX解析

3XPATH

4.2 DOM解析的工具

Sun官方jaxp工具

jdom工具

dom4j工具: 三大框架读取xml文件的程序。(非官方的,第三方的)

dom for java

iphone4s  iphone for steven   

4.3 dom4j工具使用

1)到dom4j的官方下载 。dom4j-1.6.1.zip

2)导入dom4j的支持jar包、

dom4j-1.6.1.jar核心包

总结:

xml解析

dom解析方法: dom4j的工具

查:

标签: element("name")  

elements("name")

elements();

getName() 标签名称

getRootElement(): 根标签

属性: atrributeValue("name")  属性值

atrribute("name")  对象

atrributes()  属性对象列表

getName() : 属性名

getValue() 属性值

文本:

  getText();  当前标签的文本

  elementText("name")  子标签的文本

增:

DocumentHelper.createDocument()   文档

addElement("name");   标签

addAtribute"name","value" )  属性

addText(“”);

改:

setValue()   修改属性值

addAttribute(”同名“) 修改属性值

setText()    修改文本内容

删除:

detach()   标签、属性

getParent().remove(标签/属性)

作业:

编写一个通讯录程序

功能需求:

1)增加联系人

2)修改联系人

3)删除联系人

4)查询所有联系人(全部)

要求:

1)交互使用控制台进行交互

2)联系人的数据存储到xml文件中(contact.xml)  dom4j的操作)

Demo1

使用dom4j工具读取一个xml文件

1)创建xml解析器对象

2)读取xml文件

Demo2

 使用dom4j读取xml的标签

      getRootElement(): 获取根标签

      getName(): 获取标签名称

      element("名称"): 获取第一个指定名称的子标签

      elements("名称"): 获取指定名称的所有的子标签

      elements(): 获取所有子标签

1.1 读取根标签

1.2 获取标签名称

1.3 获取第一个子标签(根据指定的名称获取第一个子标签)

1.4 获取所有子标签(根据指定的名称获取所有同名子标签)

遍历List几种方式?

1)传统for循环

2)for-each循环

3)迭代器

1.4 获取所有子标签(不指定名称)

Demo3

使用dom4j获取xml上的属性信息

1.1 在标签上获取属性值(根据属性名称获取对应的属性值)

1.2 根据属性名称获取属性对象

拿到标签对象

拿到属性对象

通过属性对象拿到 属性名

通过属性对象拿到 属性值

1.3 获取标签的所有属性对象

Demo4

使用dom4j获取xml的文本信息

 注意:

    xml文件中,空格和换行会作为xml的内容被解析到。

    xml中空格和换行和java代码中空格换行不一样。

    java代码中的空格和换行是没意义的,为了代码的格式格式好看而已。

1.1 拿到所在标签上的文本内容getText

1.2 通过父标签获取指定子标签的文本内容elementText

Demo5

使用dom4jxml文件的信息封装成对象

2)创建List对象

3)xml信息->list对象

3.1 读取到所有contact标签

3.2 创建Contact对象

3.3 contact标签数据放入contact对象中

3.4 contact对象放入list对象

保存数据   list.add(对象)

1 XPath技术

1.1 作用 

作用: 快速地查询到xml文件中节点。

xml文件中的标签层次结构很深,那么如何来快速地定位到所需的标签呢?这就用到了xpath技术!!

1.2 体验xpath技术 

1)导入jaxen-1.1-beta-6.jar  dom4jxpath插件包

2)在dom4j中使用xpath

List<Node> list = selectNodes("xpath表达式")  查询多个节点

Node node = selectSingleNode("xpath表达式")   查询一个节点

1.3 xpath表达式(重点)

/   绝对路径    斜杠在最前面,代表xml文件的根。斜杠在中间,表示子元素。

//  相对路径    选择后代元素(不分层次结构)

*   通配 选择所有元素

[ ]   条件        选择什么条件下的元素。例如 /AAA/BBB[1] 选择第一个BBB子元素

@   属性         选取属性

=    内容 (值)  

and  逻辑与

text()   选取文本内容

 案例:

"/student-list"; //根标签student-list

"/student-list/student"; //student-list根标签下的student子标签

"/student-list/*"; //选择根据标签student-list下的所有子标签

"/student-list//*"; //选择根标签student-list下的所有后代标签(不分层次结构)

"//name"; //选择所有name标签(不分层次)

"//student/name"; //选择所有父标签是studentname标签

"//student[1]";// 第一个student标签

"//student[last()]";//最后一个student标签

"//@id"; // 选择所有id属性

"//student[@id]"; //选择所有包含id属性的student标签

"//student[@id='002']"; //选择id属性值为002student标签

"//name[text()='张三']";//文本内容为张三name标签

2 SAX解析

2.1 引入

xml解析方法:

dom解析:原理xml解析引擎一次性把整个xml文件加载进内存,在内存创建一颗document树。 

   问题:大文件的话,使用dom解析效率比较低,甚至会导致内存溢出。

编码方式: 面向对象编程方式

sax解析: 原理加载一点,读取一点,处理一点。优势:占用的内存比较小。

   编程方式:基于事件编程方式。

2.2 SAX解析工具

sun公司官方的sax解析工具。  在jdk中包含sax解析工具的apiorg.xml.sax.*;

SAXParserFactory.newInstance().newSAXParser();

extends DefaultHandler;

2.3 SAX解析的开发步骤

===============  DOM解析 vs  SAX解析=====================

DOM解析

SAX解析

原理

一次性加载进内存,构造docuemnt数,内存占用比较大

加载一点,读取一点,内存占用相对小

读取顺序

可以读取XML文件任意位置信息,甚至往回读

只能是从上往下依次读取,不能往回读

操作方式

可以进行查询,也可以进行修改

只能查询

编码方式

面向对象编程方式,更加适合java开发者

基于事件编程方式,相对java开发难理解

原文地址:https://www.cnblogs.com/lldsgj/p/10801100.html