目录

 
示意图

1. 定义

XML,即 extensible Markup Language ,是一种数据标记语言 & 传输格式


2. 作用

对数据进行标记(结构化数据)、存储 & 传输

区别于 htmlhtml用于显示信息;而 XML用于存储&传输信息


3. 特点

 
示意图

4. 语法

  • 元素要关闭标签
    < p >this is a bitch <p>
  • 对大小写敏感
< P >这是错误的<p>
< p >这是正确的 <p>
  • 必须要有根元素(父元素)
<root>
<kid>
</kid>
</root>
  • 属性值必须加引号
<note date="16/08/08">
</note>
  • 实体引用
实体引用 符号 含义
&lt; < 小于
&gt ; > 大于
&amp; & 和浩
&apos; 单引号
&quot; " 双引号

元素不能使用&(实体的开始)和<(新元素的开始)

  • 注释
    ``
  • XML的元素、属性和属性值

文档实例

<bookstore>
<book category="CHILDREN">
<title lang="en"> Harry Potter </title>
<author> JK.Rowling</author>
</book>
<book category="WEB">
<title lang="en"> woshiPM </title>
<author>Carson_Ho</author>
</book>
</bookstore>

其中,<bookstore>是根元素;<book>是子元素,也是元素类型之一;而<book>中含有属性,即category,属性值是CHILDREN;而元素<author>则拥有文本内容( JK.Rowling)

  • 元素与属性的差别
    属性即提供元素额外的信息,但不属于数据组成部分的信息。

范例一

<bookstore>
<book category="CHILDREN">
<title lang="en"> Harry Potter </title>
<author> JK.Rowling</author>
</book>

范例二

<bookstore>
<book >
<category>CHILDREN<category>
<title lang="en"> Harry Potter </title>
<author> JK.Rowling</author>
</book>

范例一和二提供的信息是完全相同的。

一般情况下,请使用元素,因为

  1. 属性无法描述树结构(元素可以)
  2. 属性不容易拓展(元素可以)

使用属性的情况:用于分配ID索引,用于标识XML元素。

实例

<bookstore>
<book id = "501">
<category>CHILDREN<category>
<title lang="en"> Harry Potter </title>
<author> JK.Rowling</author>
</book>
<book id = "502">
<category>CHILDREN<category>
<title lang="en"> Harry Potter </title>
<author> JK.Rowling</author>
</book>
<bookstore>

上述属性(id)仅用于标识不同的便签,并不是数据的组成部分

  • XML元素命名规则
  1. 不能以数字或标点符号开头
  2. 不能包含空格
  3. 不能以xml开头
  • CDATA
    不被解析器解析的文本数据,所有xml文档都会被解析器解析(cdata区段除外)
    <![CDATA["传输的文本 "]]>

  • PCDATA
    被解析的字符数据


5. XML树结构

XML文档中的元素会形成一种树结构,从根部开始,然后拓展到每个树叶(节点),下面将以实例说明XML的树结构。

  • 假设一个XML文件如下
<?xml version ="1.0" encoding="UTF-8"?>
<简历>
<基本资料>
<求职意向>
<自我评价>
<其他信息>
<联系方式>
<我的作品>
</简历>
  • 其树结构如下

     
    树结构 .png
  • XML节点解释
    XML文件是由节点构成的。它的第一个节点为“根节点”。一个XML文件必须有且只能有一个根节点,其他节点都必须是它的子节点。

     
     

    this 代表整个XML文件,它的根节点就是 this.firstChild 。 this.firstChild.childNodes 则返回由根节点的所有子节点组成的节点数组。

     
     

每个子节点又可以有自己的子节点。节点编号由0开始,根节点的第一个子节点为 this.firstChild.childNodes[0],它的子节点数组就是this.firstChild.childNodes[0].childNodes 。

 
 

根节点第一个子节点的第二个子节点 this.firstChild.childNodes[0].childNodes[1],它返回的是一个XML对象(Object) 。这里需要特别注意,节点标签之间的数据本身也视为一个节点 this.firstChild.childNodes[0].childNodes[1].firstChild ,而不是一个值。

 
 

我们解析XML的最终目的当然就是获得数据的值:this.firstChild.childNodes[0].childNodes[1].firstChild.nodeValue 。

请注意区分:节点名称(<性别></性别>)和之间的文本内容(男)可以当作是节点,也可以当作是一个值

节点:
名称:this.firstChild.childNodes[0].childNodes[1]
文本内容:this.firstChild.childNodes[0].childNodes[1].firstChild

值:
名称:this.firstChild.childNodes[0].childNodes[1].nodeValue
(节点名称有时也是我们需要的数据)
文本内容:this.firstChild.childNodes[0].childNodes[1].nodeName

在了解完XML之后,是时候来学下如何进行XML的解析了


6. 解析方式

  • 解析XML,即从XML中提取有用的信息
  • XML的解析方式主要分为2大类:
     
    示意图

6.1 DOM方式

  • 简介
    Document Object Model,即 文件对象模型,是 一种 基于树形结构节点 & 文档驱动 的XML解析方法

定义了访问 & 操作xml文档元素的方法和接口

  • 解析原理
 
示意图
  • 具体解析实例
// 假设需要解析的XML文档如下(subject.xml)

<?xml version ="1.0" encoding="UTF-8"?>`
<code>
<language id="1">
<name>Java</name>
<usage>Android</usage>
</language>
<language id="2">
<name>Swift#</name>
<usage>iOS</usage>
</language>
<language id="3">
<name>Html5</name>
<usage>Web</usage>
</language>
</code> // 解析的核心代码 public static List<subject> getSubjectList(InputStream stream)
{ tv = (TextView)findViewById(R.id.tv);
try {
//打开xml文件到输入流
InputStream stream = getAssets().open("subject.xml");
//得到 DocumentBuilderFactory 对象
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//得到DocumentBuilder对象
DocumentBuilder builder = builderFactory.newDocumentBuilder();
//建立Document存放整个xml的Document对象数据
Document document = builder.parse(stream);
//得到 XML数据的"根节点"
Element element = document.getDocumentElement();
//获取根节点的所有language的节点
NodeList list = element.getElementsByTagName("language");
//遍历所有节点
for (int i= 0;i<=list.getLength();i++){
//获取lan的所有子元素
Element language = (Element) list.item(i);
//获取language的属性(这里即为id)并显示
tv.append(lan.getAttribute("id")+"\n");
//获取language的子元素 name 并显示 tv.append(sub.getElementsByTagName("name").item(0).getTextContent()+"\n");
//获取language的子元素usage 并显示 tv.append(sub.getElementsByTagName("usage").item(0).getTextContent()+"\n");
}
  • 特点 & 应用场景
 
示意图

6.2 SAX 方式

  • 简介
    Simple API for XML一种 基于事件流驱动、通过接口方法解析 的XML解析方法

  • 解析原理

     
    示意图
  • 解析实例
    在使用SAX解析XML文档时,关键在于 自定义自己的Handler处理类 & 复写对应方法
public class MyHandler extends DefaultHandler{
@Override
public void startDocument() throws SAXException{
} @Override
public void startElement(String uri,String localName,String qName,
Attributes attributes) throws SAXException{
} @Override
public void characters(char[] ch,int start,int length) throws SAXException{
} @Override
public void endElement(String uri,String localName,String qName)
throws SAXException{
} @Override
public void endDocument() throws SAXException{
}
}
  • 特点 & 应用场景
 
示意图

6.3 PULL解析

  • 简介
    一种 基于事件流驱动 的XML解析方法
  • 解析原理
 
示意图
  • 解析模板代码

注:Android中自带了Pull解析的jar包,故不需额外导入第三方jar

// Pull使用循环解析
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xml.setInput(new StringReader(xmlData)); int eventType = xmlPullParser.getEventType(); while(eventType!=XmlPullParser.END_DOCUMENT){
String nodeName = xmlPullParser.getName();
switch(eventType){
case XmlPullParser.START_DOCUMENT:{}
case XmlPullParser.START_TAG:{}
case XmlPullParser.END_TAG:{}
}
eventType = parser.next();
}
  • 解析实例
public class MainActivity extends Activity {
private EditText et;
private Button myButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myButton = (Button) this.findViewById(R.id.btn01);
et = (EditText) this.findViewById(R.id.edittext01);
myButton.setOnClickListener(new OnClickListener() {
//可变字符序列,比StringBuffer块
StringBuilder sb = new StringBuilder("");
Resources res = getResources();
XmlResourceParser xrp = res.getXml(R.xml.subject);
@Override
public void onClick(View v) {
int counter = 0;
try { // 判断是否到了文件的结尾
while (xrp.getEventType() != XmlPullParser.END_DOCUMENT) {
//文件的内容的起始标签开始,这里的起始标签是subject.xml文件里面<subjects>标签下面的第一个标签
int eventType=xrp.getEventType();
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
String tagname = xrp.getName();
if (tagname.endsWith("language")) {
counter++;
sb.append("这是第" + counter + "种语言"+"\n");
//可以调用XmlPullParser的getAttributte()方法来获取属性的值
sb.append("语言id是:"+xrp.getAttributeValue(0)+"\n");
}
else if(tagname.equals("name")){
//可以调用XmlPullParser的nextText()方法来获取节点的值
sb.append("语言名称是:"+xrp.nextText()+"\n");
}
else if(tagname.equals("teacher")){
sb.append("用途是:"+xrp.nextText()+"\n");
}
break;
case XmlPullParser.END_TAG:
break;
case XmlPullParser.TEXT:
break;
}
//解析下一个事件
xrp.next();
}
//StringBuilder要调用toString()方法并显示
et.setText(sb.toString());
} catch (XmlPullParserException e) { } catch (IOException e) {
e.printStackTrace();
}
}
});
}
  • 特点 & 应用场景
 
示意图

6.4 解析方式对比

 
示意图

7. 总结

  • 本文全面介绍了现今主流的数据传输格式 XML,下面用一张图总结XML的主流解析方法

     
    示意图

作者:Carson_Ho
链接:https://www.jianshu.com/p/e636f4f8487b
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Android:XML简介 & 解析方式对比(DOM、SAX、PULL)的更多相关文章

  1. Android 通过Dom, Sax, Pull解析网络xml数据

    这篇文章不是完全原创,XML解析的部分参考了 liuhe688 的文章.文章地址:http://blog.csdn.net/liuhe688/article/details/6415593 这是一个几 ...

  2. XML的解析方式(DOM、SAX、StAX)

    (新)  XML的解析方式(DOM.SAX.StAX) 博客分类: XML   一般来说,解析XML文件存在着两种方式,一种是event-based API,比如说象SAX,XNI. 第二种是tree ...

  3. - XML 解析 总结 DOM SAX PULL MD

    目录 目录 XML 解析 总结 DOM SAX PULL MD 几种解析方式简介 要解析的内容 DOM 解析 代码 输出 SAX 解析 代码 输出 JDOM 解析 代码 输出 DOM4J 解析 代码 ...

  4. xml的解析方式的简介

    xml的解析的简介(写到java代码) *xml是一个标记型文档 *js使用dom解析标记型文档? -根据html的层级结构,在内存中分配一个树形结构,把html的标签,属性和文本都封装成对象 -do ...

  5. 二、Android XML数据解析

    XML,可扩展标记语言.可以用来存储数据,可以看做是一个小型的数据库,SharedPreference就是使用XML文件存储数据的,SQLite底层也是一个XML文件,而在网络应用方面,通常作为信息的 ...

  6. 黑马day01 xml 的解析方式

    XML编程:利用java程序去增删改查(CRUD)xml中的数据 解析思想: dom解析 sax解析 基于这两种解析思想市面上就有了非常多的解析api sun jaxp既有dom方式也有sax方式,而 ...

  7. :Android网络编程--XML之解析方式:SAX

    任何放置在资源(res)目录下的内容可以通过应用程序的R类访问,这是被Android编译过的,而任何放置在资产(assets)目录下的内容会保持它的原始文件格式,为了读取它们,必须使用AssetMan ...

  8. Java 解析 xml 常见的4中方式:DOM SAX JDOM DOM4J

    Java 四种解析 XML 的特点 1.DOM 解析: 形成了树结构,有助于更好的理解.掌握,且代码容易编写. 解析过程中,树结构保存在内存中,方便修改. 2.SAX 解析: 采用事件驱动模式,对内存 ...

  9. 解析XML:DOM,SAX,PULL

    Android解析XML有三种方式:DOM(document object model).SAX(simple api XML).PULL 1.DOM DOM解析XML文件时,会将XML文件的所有内容 ...

随机推荐

  1. Java中子类和父类相关方法的执行顺序

    无意中看到下面一个题目,大家一起来看看最后的输出结果是什么.反正我看完之后,用IDE测试后感觉知识点得到巩固了. /** * 函数执行顺序测试 * Created by 萌小Q on 2017/5/1 ...

  2. Leetcode 283.移动零 By Python

    思路 我们可以用python的list comprehension来取出所以非0的元素,而且这样取出来会保持原有的相对顺序,再统计先后变化的长度,补上相应的0即可 代码 class Solution( ...

  3. 自学Aruba6.2-控制器基本维护操作(web页面配置)

    点击返回:自学Aruba之路 自学Aruba6.2-控制器基本维护操作(web页面配置) 1 显示当前控制器版本 Dashboard---Controller中 2 升级Aruab os版本 Main ...

  4. android-support-v4.jar 免积分下载

    资源名称:android扩展插件 android-support-v4.jar 资源大小:137KB 上传日期:2012-10-08 资源积分:1 下载次数:136 电信下载地址:http://www ...

  5. sql server 小技巧(8) visual studio 2013里使用Sql server compact 4.0及发布问题处理

    1. 安装 Microsoft SQL Server Compact 4.0  https://www.microsoft.com/zh-cn/download/confirmation.aspx?i ...

  6. LoadRunner断言:正确结果有多种情况

    用过lr的都知道,我们可以用web_reg_find这个注册函数判断某个请求的返回中是否有我们要找的内容. 但是,如果正常的情况有多种,该如何断言呢? 设置多个检查点 把每个检查点获取到的结果数量相加 ...

  7. cf757F Team Rocket Rises Again (dijkstra+支配树)

    我也想要皮卡丘 跑一遍dijkstra,可以建出一个最短路DAG(从S到任意点的路径都是最短路),然后可以在上面建支配树 并不会支配树,只能简单口胡一下在DAG上的做法 建出来的支配树中,某点的祖先集 ...

  8. 解决invalid record found in VCF4 file (at least 8 tab-delimited fields expected)问题,批量修改空格改为制表格格式

    出现这种问题说明一般存在两个问题: 第一,vcf文件不足8个分割制表符,比如像如下文件: 为了解决这个问题,说明在做snp filter时候,需要提取至少8个制表符的字符串,比如,像如下文件所示: 第 ...

  9. NO.11 复制时勿忘其每个成分

    1.Coping 函数应该确保复制对象内的"每一个成员变量",和调用合适的 "base class"构造函数(base class 某些成员往往是private ...

  10. 7.STL

    一.什么是STL  STL是standart template library,标准模板库.  是HP实验室开发的一系列软件的统称,从根本上来说,它是一些容器和算法的集合,它是世界上很多最聪明的程序员 ...