程序员人生 网站导航

粗浅看 XML

栏目:htmlcss时间:2016-06-23 14:34:16

概述 

eXtensible Markup Language 可扩大标记语 言——由 W3C 组织发 布,目前推荐遵照的是 W3C 组织于 2000 年发 布的 XML1.0 规范。

XML 的使命,就是以1 个统1的格式,组织有 关系的数据,为不同平 台下的利用程序服务。


<?xml version="1.0" encoding="utf⑻"?> 

<中国>

<北京>

<海淀></海淀>

<丰台></丰台>

</北京>

<湖南>

<长沙></长沙>

<岳阳></岳阳>

</湖南>

<湖北>

<武汉></武汉>

<荆州></荆州>

</湖北>

</中国>


主要用处

配置文件

   JavaWeb

框架 数据交换

   Ajax WebService

数据存储

   保存关系型数据

 

 

语法

文档结构



文档声明

①在编写 XML 文档时,必须在文件的第1行书写文档声明。 最简单的声明语法:<?xml version="1.0" ?>

②用 encoding 属性说明读取文档所用的解码的字符集:

<?xml version="1.0" encoding="GB2312" ?>

这样就要求保存文件时,必须用 GB2312 编码保存。此时要求 XML 文档的作者确 认当前编辑器保存文档的编码方式。

eclipse 会自动依照解码字符集进行编码保存 记事本需要另存为指定的字符集


语法规则

①第1行动 XML 声明,且必须顶格写

②只能有1个根标签

③标签必须正确结束

④标签不能交叉嵌套

⑤严格辨别大小写

⑥属性必须有值,且必须加引号

⑦标签不能以数字开头


转义字符

特殊字符

替换符号

&lt;

&gt;

&

&amp;

&quot;

&apos;

 

CDATA 区

①当 XML 文档中需要写1些程序代码、SQL 语句或其他不希望 XML 解析器进行 解析的内容时,就能够写在 CDATA 区中

②XML 解析器会将 CDATA 区中的内容原封不动的输出

③CDATA   区的定义格式:<![CDATA[„]]> 例如:

 

注释

①Xml 文件中的注释采取:“<!--注释-->” 格式。注意:

●XML 声明之前不能有注释

●注释不能嵌套


处理指令

①处理指令,简称 PI  (processing instruction)。处理指令用来指挥解析引擎如何解析 XML 文档内容。

②处理指令必须以“<?”作为开头,以“?>”作为结尾,XML 声明语句就是最常 见的1种处理指令。

例如,在 XML 文档中可使用 xml-stylesheet 指令,通知 XML 解析引擎,利用 css

文件显示 xml 文档内容。

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

解析

解析方式

dom:(Document Object Model,  即文档对象模型)  是 W3C  组织推荐的处理

XML  的1种方式。 它下面有两个分支:jDom 与 dom4j

它们可都可以对 xml 文件进行增删改查的操作

sax: (Simple API for XML) 不是官方标准,但它是 XML  社区事实上的标准, 几近所有的 XML  解析器都支持它。

只能进行解析(查询)

pull:     Pull 解析和 Sax 解析很类似,都是轻量级的解析,它是1个第3方开 源的 Java 项目,但在 Android 的内核中已嵌入了 Pull  。 只能进行解析(查询)


解析技术体系


DOM 解析

1. DOM 中对象接口关系图


l    Node:xml 文件所有对象的根接口  节点

l    Document:代表 xml 文件的全部内容的对象的接口

l    Element:代表某个元素或标签的对象的接口

l    Attr:代表某个元素的某个属性对象的接口

l    Text:代表标签体文本标签本对象的接口 

l    NodeList:代表包括多个 Node 接口对象的集合对象

2.主要方法概览

Node

appendChild(newChild)

将新的节点添加为最后1个子节点

 

insertBefore(newChild,refChild)

在某个子节点前插入1个新子节点

 

removeChild(oldChild)

删除指定的某个子节点

 

replaceChild(newChild,oldChild)

将指定的子节点替换成新的子节点

 

setTextContent(textContent)

设置文本内容(1般用在元素对象上)

 

getNodeName()

得到节点名称(1般用在元素对象上)

 

getParentNode()

得到父节点(1般用在元素对象上)

 

getTextContent()

得到文本内容(1般用在元素对象上)

 

getFirstChild()

得到第1个子节点

 

getLastChild()

得到最后1个子节点

 

getNextSibling()

得到下1个兄弟节点

 

getPreviousSibling()

得到上1个兄弟节点


Document

createElement(name)

创建1个指定名称的标签对象返回

 

getDocumentElement ()//getRootElement()

得到文档的根元素对象

 

getElementById(id)

根据子元素的 id 属性找到对应的子元素

 

getElementsByTagName(name)

根据标签名得到对应的子标签的集合

Element

 

 

 

setAttribute(name, value)

设置元素的属性名和属性值

 

removeAttribute(attrName)

根据属性名删除对应的属性

 

getAttribute(attrName)

根据属性名得到对应的属性

 

getElementsByTagName(name)

根据标签名得到对应的子标签的集合

 

getTagName()

得到标签名

Attr、Text

极少直接操作这两个接口的对象,1般通过 Element 对象来操作

NodeList

getLength()得到包括的节点对象的个数  item(index)根据下标得到某个节点


3.demo

读取 id 为 008 的员工的年龄

<?xml version="1.0" encoding="UTF⑻"?> <class> <employeer id="007"> <name>王灵</name> <age>18</age> </ employeer > < employeer id="008"> <name>张童</name> <age>23</age> </ employeer > </class>


4.提示:获得解析器对象

javax.xml.parsers 包中的 DocumentBuilder 类用于加载 xml 文件,并产生1个 Document 对象

//创建1个 xml 文档解析器工厂对象

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();


//通过工厂创建1个 xml 文档解析器对象

DocumentBuilder builder = factory.newDocumentBuilder();


//通过解析器对象解析1个文件对象得到 Document 对象

Document document = builder.parse(new File("d:/users.xml")); 


XML dom4j解析

1.Dom4j 是1个简单、灵活的开放源代码的库。Dom4j 是由初期开发 JDOM 的人分离出来而 后独立开发的。与 JDOM 不同的是,dom4j 使用接口和抽象基类,虽然 Dom4j 的 API 相对要 复杂1些,但它提供了比 JDOM 更好的灵活性。

2.Dom4j 是1个非常优秀的 Java XMLAPI,具有性能优良、功能强大和极易使用的特点。现 在很多软件采取的 Dom4j,例如 Hibernate。使用Dom4j 开发,需下载 dom4j 相应的 jar 文 件。

3.获得 Document 对象

SAXReader reader = new SAXReader();

Document    document= reader.read(new File( "input.xml“ ));

4.元素操作

•     //获得文档的元素.

Element root = document.getRootElement();

•     //获得某个元素的指定名称的第1个子节点

Element element = element.element(“书名");


•     //获得某个元素的指定名称的所有子元素的集合

List list = element.elements(“书名”);

•     //添加1个指定名称的子元素

Element childEle =parentEle.addElement(“书名”);

•     //删除某个元素指定的子元素 parentEle.remove(childEle);

5.属性操作

•     //获得某个元素的指定名称的属性对象

Attribute attr = element.attribute(“id”);

•     //获得某个元素的指定名称的属性值

String id =element.attributeValue(“id”);

•     //给元素添加属性或更新其值

Attribute attr =element.addAttribute(“id”,”123”);

•     //删除某个元素的指定属性 element.remove(attribute);

6.文本操作

•     //获得某个元素的文本内容 String text = element.getText();

•     //给某个元素添加或更新文本内容

element.setText(“Tom”);

7.将文档写入 XML 文件,使更改生效

OutputFormat format = OutputFormat.createPrettyPrint();

XMLWriter writer = newXMLWriter( newFileOutput( "output.xml“),format);

writer.write(document); writer.close();


XPath解析

1. XPath  是在 XML 文档中查找信息的语言 XPath  是通过元素和属性进行查找 XPath 简化了 Dom4j 查找节点的进程 使用 XPath 必须导入 jaxen⑴.1-beta⑹.jar

否则出现

NoClassDefFoundError: org/jaxen/JaxenException 2.XPath 语法示例

/employeers/employeer

从根元素开始逐层找,以”/”开头

//name

直接获得所有 name 元素对象,以“//”开头

//employeer/*

获得所有employeer元素

 

 

 

 元素的所有子元素对象


//employeer[1]或

//employeer[last()]

获得所有 employeer 元素的第1个或最后1个

//employeer[@id]

获得所有带 id 属性的 employeer 元素对象

//employeer[@id=‘002']

获得 id 等于 002 的 employeer 元素对象

3.查询节点

•     获得所有符合条件的节点

–      document.selectNodes(String xpathExpression)  返回 List 集合

•     获得符合条件的单个节点

–      document.selectSingleNode(String xpathExpression)

–    返回1个 Node 对象。如果符合条件的节点有多个,那末返回第1个。


XML SAX 解析

1.  为何会出现 SAX 解析?

在使用 DOM 解析 XML 文档时,需要读取全部 XML 文档,在内存中构架代表全部 DOM 树的 Doucment 对象,从而再对 XML 文档进行操作。此种情况下,如果 XML 文档特 别大,就会消耗计算机的大量内存,并且容易致使内存溢出。

SAX 解析允许在读取文档的时候,即对文档进行处理,而没必要等到全部文档装载完才会文档进行操作。

注意:sax 只能用于读取 xml 文件,没法作更新

2. SAX 采取事件处理的方式解析 XML 文件,利用 SAX  解析 XML  文档,触及两个部份:解 析器和事件处理器(对象):

解析器可使用 JAXP 的 API 创建,创建出 SAX 解析器后,就能够指定解析器去解析某 个 XML 文档。

解析器采取 SAX 方式在解析某个 XML 文档时,它只要解析到 XML 文档的1个组成部份,都会去调用事件处理器的1个方法,解析器在调用事件处理器的方法时,会把当前解析到的 xml 文件内容作为方法的参数传递给事件处理器。

事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就能够很轻松地得到

sax 解析器解析到的数据,从而可以决定如何对数据进行处理。

3.解析方式

•      使用 SAXParserFactory 创建 SAX 解析工厂

SAXParserFactory factory = SAXParserFactory.newInstance();

•     通过 SAX 解析工厂得到解析器对象

SAXParser sp = factory.newSAXParser();

•     通过解析器对象得到1个 XML 的读取器

XMLReader xmlReader = sp.getXMLReader();

•     设置读取器的事件处理器


—————————————————————————————

xmlReader.setContentHandler(new BookParserHandler());

•     解析 xml 文件

xmlReader.parse("book.xml");


XML Pull 解析

1.  为何会出现 PULL 解析?

Pull 解析与 sax 解析类似都是基于事件方法回调机制来实现对 xml 文件解析。

Sax 解析不足:即便已找到所要的数据,xml 数据还是会全部加载进来并产生方法调 用。程序员没法停止这些无用的操作,而 pull 解析解决了此问题。

Pull 解析:加载每部份数据产生方法调用,都必须通进程序员调用1个固定的方法才 能进行下去,否则解析工作就停止了。Next()

注意:pull 解析也只能用于读取 xml 文件,没法作更新

2. Pull 解析依赖两个 jar 包:xmlpull_1_0_5.jar 和 kxml2⑵.3.0.jar 3.经常使用接口或类

XmlPullParserFactory XmlPullParser(既是解析器又是数据的存储器)XmlPullParserException 

业务思想

关于XML的总结自己感觉也是很成心思的,虽然经历了痛苦演变的整理进程,以后还是很有收获的。

作为1种可扩大的标记语言,项目中我们还是常常遇到的,所以呢,不能不学习明白哦。对XML的使用,是我们最为关注的,抛砖引玉吧,写了1些小的demo,希望我们都可以做的更好!


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐