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个根标签
③标签必须正确结束
④标签不能交叉嵌套
⑤严格辨别大小写
⑥属性必须有值,且必须加引号
⑦标签不能以数字开头
转义字符
特殊字符 | 替换符号 |
< | < |
> | > |
& | & |
“ | " |
‘ | ' |
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 的员工的年龄
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,希望我们都可以做的更好!
上一篇 第12章Swing编程
下一篇 Java之IO操作总结