7.Xml
Xml
====================================
* 可扩展的标记语言
* 结构化的数据
* 不用来展示数据
* 作用:
*)存储数据
*)传输数据
Xml 语法
====================================
1.头标签
<?xml version="1.0" encoding="GBK"?>
必须是第一个字节
2.根元素,只能有一个
3.元素必须有结束标签
<a> </a>
<a />
4.元素必须正确嵌套
<a>
<b>
</b>
</a>
5.属性,必须有值
6.属性值,必须有引号
<a k1="v'1" k2='v"2' k3="v3">
7.转义实体
< <
> >
" "
' '
& &
8.<![CDATA[...]]>
计算机提取cdata块中的文本时,
不做任何运算处理,所有字符
作为普通字符提取出来
9.<!-- 注释 -->
标签 Tag
=====================================
* 一对尖括号
<a> a的开始标签
</a> a的结束标签
元素 Element
=====================================
* 包含从开始标签到结束标签全部内容
to元素:
<to>
<to-email>bbb@bbb.com</to-email>
<to-email>ccc@ccc.com</to-email>
<to-email>ddd@ddd.com</to-email>
</to>
文本 Text
=====================================
* 开始标签和结束标签之间的文本内容
<a>owhgoshdofwheowong</a>
属性 Attribute
=====================================
* 开始标签中的键值对
<a k1="v1">
java 处理xml的API
==========================================
* SAX
* XML PULL
SAX
========================================
* Simple API for XML
* SAXParserFactory
SAXParser
DefaultHandler
SAXParserFactory
---------------------------------
* sax 解析器工厂对象,
负责创建 sax 解析器
创建对象
-------------------------------
SAXParserFactory f =
SAXParserFactory.newInstance();
方法
-------------------------------
newSAXParser()
新建解析器对象
SAXParser
---------------------------------------
方法
--------------------------------
parse(文件, 数据处理器)
读取并从文件提取数据,
将数据传递到处理器进行处理
DefaultHandler
--------------------------------------
* 数据处理器父类
方法
---------------------------------
startElement()
endElement()
characters()
XML PULL
=============================================
* 第三方开源 API
* Android 开发库中,集成了 Xml pull
* XmlPullParserFactory
Xml
XmlPullParser
XmlSerializer
XmlPullParserFactory
----------------------------------------
* 用来创建解析器对象,
和序列化器对象的工厂
创建对象
-------------------------------------
XmlPullParserFactory f
XmlPullParserFactory.newInstance();
方法
-------------------------------------
newXmlPullparser()
newXmlSerializer()
Xml
-------------------------------------
* 代替工厂的辅助工具类
方法
---------------------------------
Xml.newXmlPullparser()
Xml.newXmlSerializer()
XmlPullparser
-----------------------------------------
* 解析器,用来读取、解析 xml 文档
方法
------------------------------------
setInput(Reader in)
setInput(InputStream in, String encoding)
设置输入流,
从指定的流,读取 xml 数据
必须首先调用
next()
跳到下一段,返回表示数据类型的整数代码
结束后,再向后跳,返回 XmlPullParser.END_DOCUMENT = 1
getEventType()
返回当前位置的数据类型代码
getName()
获得标签名
数字类型代码是:
XmlPullParser.START_TAG
XmlPullParser.END_TAG
才能调用
getText()
获得文本
数字类型代码是:
XmlPullParser.TEXT
才能调用
nextText()
向后跳一步,并取出文本
数字类型代码是:
XmlPullParser.START_TAG
才能调用
getAttributeCount()
获得属性数量
getAttributeName(index)
获得指定位置的属性名
getAttributeValue(index)
获得指定位置的属性值
getAttributeValue(namespace, name)
根据属性名获得它对应的值
namespace,如果没有,给null值
数字类型代码是:
XmlPullParser.START_TAG
才能调用属性处理方法
XmlSerializer
------------------------------------------
* 序列化器,
将数据变成xml格式的字符序列输出
方法
------------------------------------
setOutput(Writer out)
setOutput(OutputStream out, String encoding)
设置用来输出数据的输出流
必须首先调用
startDocument(字符编码, 是否独立文件)
输出 xml 头标签
<?xml version="1.0"
encoding="GBK"
standalone="yes"?>
startTag(namespace, name)
输出开始标签
attribute(namespace, name, value)
输出属性
text(String text)
输出文本
endTag(namespace, name)
输出结束标签
cdsect(String text)
输出 <![CDATA[]]> 块
comment(String text)
输出 <!-- 注释 -->
XML解析:
SAX解析
DOM解析
把整篇文档都读入到内存中,生成一个dom树对象。
[Document对象],我们可以使用各种dom操作相关
的API方法解析xml文档中的数据。
PULL解析
流式解析,边读取边解析。
当读取的过程中遇到了解析事件,那么将会执行
我们所编写的解析代码获取相应数据,然后继续
向后驱动事件,继续解析后续文档。
解析特点:
1>有时候需要解析一篇完整文档。
2>有时候只需要获取文档中的一小部分数据。
3>有时候文档数据量很大
4>有时候文档的数据量不大
使用dom4j.jar文件 解析xml文档
常用API:
SAXReader reader;
reader.read();
Document
getRootElement()
Element
getName()
getText()
elements()
elements("book")
getAttibuteValue()
......
使用Pull的方式解析XML
流式解析,边读取边解析。
当读取的过程中遇到了解析事件,那么将会执行
我们所编写的解析代码获取相应数据,然后继续
向后驱动事件,继续解析后续文档。
使用pull解析的方式在整个解析过程中将会遇到
很多的解析事件:
XmlParser.START_DOCUMENT 遇到了文档开始
XmlParser.END_DOCUMENT 遇到了文件结束
XmlParser.START_TAG 遇到了开始标签
XmlParser.END_TAG 遇到了结束标签
实现步骤:
XmlPullParser parser=Xml.newPullParser();
parser.setInput(is, "utf-8");
int event=parser.getEventType();
while(event!=XmlPullParser.END_DOCUMENT){
switch(event){
case XmlParser.START_DOCUMENT 遇到了文档开始
case XmlParser.START_TAG 遇到了开始标签
if(tag == "name"){}
else if(tag == "book"){}
......
case XmlParser.END_TAG 遇到了结束标签
}
//向后继续驱动事件 解析后续文档内容
event=parser.next();
SAX解析
DOM解析
把整篇文档都读入到内存中,生成一个dom树对象。
[Document对象],我们可以使用各种dom操作相关
的API方法解析xml文档中的数据。
PULL解析
流式解析,边读取边解析。
当读取的过程中遇到了解析事件,那么将会执行
我们所编写的解析代码获取相应数据,然后继续
向后驱动事件,继续解析后续文档。
解析特点:
1>有时候需要解析一篇完整文档。
2>有时候只需要获取文档中的一小部分数据。
3>有时候文档数据量很大
4>有时候文档的数据量不大
使用dom4j.jar文件 解析xml文档
常用API:
SAXReader reader;
reader.read();
Document
getRootElement()
Element
getName()
getText()
elements()
elements("book")
getAttibuteValue()
......
private void parseXML_DOM4J() throws Exception {
//1 导入jar包
//2 获取Document文档对象 封装整篇xml
SAXReader reader = new SAXReader();
//以流的方式读取assets目录下的内容
InputStream is = getAssets().open("books.xml");
Document doc = reader.read(is);
//3 使用document的方法 解析文档
//获取根元素
Element root = doc.getRootElement();
//获取books元素的所有子元素
List<Element> eles = root.elements();
//遍历所有子元素
for(Element e : eles){
//每一个e 描述了一个book元素
Log.i("info", "标签名:"+e.getName()+" 属性:"+e.attributeValue("lang"));
//获取book元素中的所有子元素
List<Element> es = e.elements();
for(Element c : es){
Log.i("info", "标签名:"+c.getName() + "标签内容:"+c.getText());
}
}
}
流式解析,边读取边解析。
当读取的过程中遇到了解析事件,那么将会执行
我们所编写的解析代码获取相应数据,然后继续
向后驱动事件,继续解析后续文档。
使用pull解析的方式在整个解析过程中将会遇到
很多的解析事件:
XmlParser.START_DOCUMENT 遇到了文档开始
XmlParser.END_DOCUMENT 遇到了文件结束
XmlParser.START_TAG 遇到了开始标签
XmlParser.END_TAG 遇到了结束标签
实现步骤:
XmlPullParser parser=Xml.newPullParser();
parser.setInput(is, "utf-8");
int event=parser.getEventType();
while(event!=XmlPullParser.END_DOCUMENT){
switch(event){
case XmlParser.START_DOCUMENT 遇到了文档开始
case XmlParser.START_TAG 遇到了开始标签
if(tag == "name"){}
else if(tag == "book"){}
......
case XmlParser.END_TAG 遇到了结束标签
}
//向后继续驱动事件 解析后续文档内容
event=parser.next();
}
private void parseXML_PULL()throws Exception{
XmlPullParser parser = Xml.newPullParser();
InputStream is = getAssets().open("books.xml");
parser.setInput(is , "utf-8");
//获取事件类型
int event = parser.getEventType();
List<Book> books = new ArrayList<Book>();
Book book = null;
while(event != XmlPullParser.END_DOCUMENT){
//解析当前事件
switch (event) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
String tag = parser.getName(); //标签名
if(tag.equals("book")){ //碰到了book
book = new Book();
}else if(tag.equals("name")){ //碰到了name
book.setName(parser.nextText());
}else if(tag.equals("isbn")){ //碰到了isbn
book.setIsbn(parser.nextText());
}else if(tag.equals("author")){ //碰到了author
book.setAuthor(parser.nextText());
}else if(tag.equals("price")){ //碰到了price
book.setPrice(parser.nextText());
}else if(tag.equals("publish_time")){ //碰到了publish_time
book.setPublishTime(parser.nextText());
}else if(tag.equals("description")){ //碰到了description
book.setDescription(parser.nextText());
}
break;
case XmlPullParser.END_TAG:
tag = parser.getName();
if(tag.equals("book")){
books.add(book);
}
break;
}
//继续向后驱动事件 解析后续文档
event = parser.next();
}
Log.i("info", ""+books);
}