1.XML概述
1.1XML:XML一种数据存储格式,这种数据存储格式在存储数据内容的同时,还能够保存数据之间的关系
1.2XML保存数据的方法:XML利用标签来保存数据的内容,利用标签之间的嵌套关系来保存数据之间的关系。
1.3XML的应用场景:
1.3.1利用XML跨平台的特性,用来在不同的操作系统不同的开发语言之间传输数据。如果说java是一门跨平台的语言,那XML就是跨平台的数据。
1.3.2利用XML可以保存具有关系的数据的特性,还常常被用来做为配置文件使用。,
1.4XML文件:把XML格式的数据保存到文件中,这样的文件通常起后缀名为.XML,这样的文件就叫做XML文件,XML文件是XML数据最常见的存在形式,但是,这不是XML的唯一存在形式(在内存中或在网络中也可以存在),不要把XML狭隘的理解成XML文件。

1.5XML校验:浏览器除了内置html解析引擎外还内置了XML解析器,利用浏览器打开XML格式的数据,就可以进行XML校验。


2、XML解析方式

目前主流的XML解析方式有三种,DOM4J(DOM解析增强)、SAX和PULL解析。其中DOM4J解析是将整个文件的内容一次全部读取出来,然后进行解析。而SAX和PULL都是采用事件处理的方式解析XML文件。采用SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器。

先说说三种解析方式的优缺点。

1、DOM4J解析(使用DOM4J解析需要下载相关的包):

优点:DOM4J解析是提供增删改查功能的,只要一次拿到解析对象后,就可以将其完全解析,可以减少重复拿对象的次数。

缺点:解析过程比较慢,需要将整个文档都解析完成后才能进行操作。需要将整个文档树的内容都加载到内存中,当文件过大的时候,非常耗费系统内存。

2、SAX解析:

优点:不需要将整个XML文件都加载到内存中,解析到哪一步会自动触发对应的方法去处理,处理效率比较高。无论文件多大,对内存的损耗都不高。

缺点:每次解析都只能处理一次,下次再处理还需要重新解析,只能进行查询功能,不能进行增删改;

3、PULL解析:

其优缺点和SAX解析差不多。


3、XML三种解析方式示例对比。

  解析文档内容

<?xml version="1.0" encoding="UTF-8"?>

<菜系> 
  <菜 id="1"> 
    <菜名>蛋炒饭</菜名>  
    <图片路径>d:\\pic</图片路径>  
    <售价>10.0元</售价> 
  </菜>  
  <菜 id="2"> 
    <菜名>饭炒蛋</菜名>  
    <图片路径>d:\\pic</图片路径>  
    <售价>10.0元</售价> 
  </菜> 
</菜系>
</pre><pre name="code" class="html">1、DOM4J解析(这里演示查和更新操作,有兴趣的同学可以自行查阅API进行增删操作)
<pre name="code" class="java">public void find() throws Exception {
		SAXReader reader = new SAXReader();
		Document dom = reader.read("product.xml");
		Element root = dom.getRootElement();

		List<Element> list = root.elements();
		for (Element book2Ele : list) {
			System.out.println(book2Ele.attributeValue("id"));
			System.out.println(book2Ele.element("菜名").getText());
			System.out.println(book2Ele.element("图片路径").getText());
			System.out.println(book2Ele.element("售价").getText());
		}

	}



public void update() throws Exception {
		SAXReader reader = new SAXReader();
		Document dom = reader.read("product.xml");
		Element root = dom.getRootElement();

		List<Element> list = root.elements();
		for (Element element : list) {
			element.element("售价").setText("10.0元");
		}

		XMLWriter writer = new XMLWriter(new FileOutputStream("product.xml"),
				OutputFormat.createPrettyPrint());
		writer.write(dom);
		writer.close();
	}


2、SAX解析

<pre name="code" class="java">public class SaxDemo1 {
	public static void main(String[] args) throws Exception {
		// 1.获取解析器工厂
		SAXParserFactory factory = SAXParserFactory.newInstance();
		// 2.通过工厂获取sax解析器
		SAXParser parser = factory.newSAXParser();
		// 3.获取读取器
		XMLReader reader = parser.getXMLReader();
		// 4.注册事件处理器
		reader.setContentHandler(new MyContentHandler());
		// 5.解析xml
		reader.parse("product.xml");

	}
}
// 适配器设计模式
class MyContentHandler extends DefaultHandler {
	private String eleName = null;
	private int count = 0;

	@Override
	public void startElement(String uri, String localName, String name,
			Attributes attributes) throws SAXException {
		this.eleName = name;
		if ("菜".equals(eleName))
			System.out.println(attributes.getValue("id"));

	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		if ("菜名".equals(eleName)) {
			System.out.println(new String(ch, start, length));
		} else if ("图片路径".equals(eleName)) {
			System.out.println(new String(ch, start, length));
		} else if ("售价".equals(eleName)) {
			System.out.println(new String(ch, start, length));
		}
	}

	@Override
	public void endElement(String uri, String localName, String name)
			throws SAXException {
		eleName = null;
	}

}
</pre><pre name="code" class="java">3、PULL解析
<pre name="code" class="java">	public void test() throws Exception {
		XmlPullParser parser = Xml.newPullParser();
		InputStream in = getContext().getAssets().open("product.xml");
		parser.setInput(in, "utf-8");
		int eventType = parser.getEventType();
		String name = "";
		while (eventType != XmlPullParser.END_DOCUMENT) {
			switch (eventType) {
			case XmlPullParser.START_TAG:
				name = parser.getName();
				if ("菜".equals(name)) {
					String attr = parser.getAttributeValue(0);
					System.out.println(attr);
				} else if ("菜名".equals(name)) {
					System.out.println(parser.nextText());
				} else if ("图片路径".equals(name)) {
					System.out.println(parser.nextText());
				} else if ("售价".equals(name)) {
					System.out.println(parser.nextText());
				}
				break;
			case XmlPullParser.END_TAG:
				break;
			}
			eventType = parser.next();
		}

	}




在Android开发中可以根据自己的实际需要去进行XML文档的解析。目前在Android开发中主流运营pull解析。其实其实还有一种很强大的解析方式,叫XPATH解析,这里不再做相关描述,有兴趣的同学可以自己去深入了解。