<?xml version="1.0" encoding="utf-8"?> <websites xmlns:sina="http://www.sina.com" xmlns:baidu="http://www.baidu.com"> <sina:website sina:blog="blog.sina.com">新浪</sina:website> <baidu:website baidu:blog="hi.baidu.com">百度</baidu:website> </websites>
Namespace(空间名称,命名空间)
引入的原因是为了避免混淆。例如上面的这个XML文档,sina和baidu都有blog属性,定义了两个namespace,就像sax官网说的,用namespace是为了实现更多的扩展功能,作为基本应用,很多时候都用不到它:
sina的namespace: http://www.sina.com
baidu的namespace:http://www.baidu.com
xmlns:sina="http://www.sina.com" xmlns:baidu="http://www.baidu.com">
namespace的值可以任意,但是注意不要重复。一般默认的格式都是以url来作为namespace,比如
xmlns:android="http://schemas.android.com/apk/res/android。
Prefix(前缀)
sina:blog中 sina就是前缀。
LocalName(本地名称)
sina:blog 中blog就是localName。
QName(Qualified Name 限定?指定?名称)
sina:blog就是QName,相当于前缀+":"+LocalName。
uri(不是url哈)
例如sina:blog的uri就是前缀sina的namespace,即"http://www.sina.com"。
sax simple API for XML,现在有两个版本,sax和sax2。
sax不支持LocalName、QName和uri。对于属性sina:blog="blog.sina.com",sax解析的结果是LocalName=QName="sina:blog",uri="",value="blog.sina.com"。
sax2支持LocalName、QName、uri。对于属性sina:blog="blog.sina.com",sax2解析的结果是LocalName="blog",QName="sina:blog",uri="",value="blog.sina.com"。
测试:
TestSax.java
package com.siqi.xml; import java.io.File; import java.io.FileReader; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; public class TestSax { public static void main(String... args) { try { //Sax2解析XML文档 System.out.println("parse xml file use sax2"); SaxParseHandler sax2Handler = new SaxParseHandler(); XMLReader xmlReader = XMLReaderFactory.createXMLReader(); xmlReader.setContentHandler(sax2Handler); xmlReader.setErrorHandler(sax2Handler); FileReader fileReader = new FileReader("./src/sample.xml"); xmlReader.parse(new InputSource(fileReader)); //sax1解析XML文档 System.out.println("parse xml file use sax"); SaxParseHandler saxHandler = new SaxParseHandler(); SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); File file = new File("./src/sample.xml"); parser.parse(file, saxHandler); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
SaxParseHandler.java
package com.siqi.xml; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * 要用sax解析,需要实现一个ParseHandler * @author siqi * */ public class SaxParseHandler extends DefaultHandler{ /** * 重写了DefaultHandler中的startElement函数,每解析到 * 一个元素(element)的时候都会触发这个函数,并且将这个element * 的属性attributes和值value当作参数传进来。除了startElement, * 还有startDocument,endDOucment,endElement,要根据需要 * 重写这些函数。 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //打印element的基本信息,qName System.out.println("Element qName : "+qName); System.out.println("Element localName: "+localName); System.out.println("Element uri : "+uri); //打印element的所有属性attributes for(int i=0; i<attributes.getLength(); i++) { System.out.println(""); System.out.println(" attribute qName : "+attributes.getQName(i)); System.out.println(" attribute localName: "+attributes.getLocalName(i)); System.out.println(" attribute value : "+attributes.getValue(i)); System.out.println(" attribute uri : "+attributes.getURI(i)); } System.out.println(""); super.startElement(uri, localName, qName, attributes); } }
parse xml file use sax2 Element qName : websites Element localName: websites Element uri : Element qName : sina:website Element localName: website Element uri : http://www.sina.com attribute qName : sina:blog attribute localName: blog attribute value : blog.sina.com attribute uri : http://www.sina.com Element qName : baidu:website Element localName: website Element uri : http://www.baidu.com attribute qName : baidu:blog attribute localName: blog attribute value : hi.baidu.com attribute uri : http://www.baidu.com parse xml file use sax Element qName : websites Element localName: Element uri : attribute qName : xmlns:sina attribute localName: xmlns:sina attribute value : http://www.sina.com attribute uri : attribute qName : xmlns:baidu attribute localName: xmlns:baidu attribute value : http://www.baidu.com attribute uri : Element qName : sina:website Element localName: Element uri : attribute qName : sina:blog attribute localName: sina:blog attribute value : blog.sina.com attribute uri : Element qName : baidu:website Element localName: Element uri : attribute qName : baidu:blog attribute localName: baidu:blog attribute value : hi.baidu.com attribute uri :
在android程序中,我在用dom4j来操作XML文档的时候发现一个问题,用dom4j解析出来的文档attribute名称都是一样的。
例xml为:
<?xml version="1.0"?> <root xmlns="http://www.w3.org/2001/XMLSchema"> <element name="Jim" age="13" score="89"></element> </root>在解析的时候解析出来的内容为
<?xml version="1.0"?> <root xmlns="http://www.w3.org/2001/XMLSchema"> <element name="Jim" name="13" name="89"></element> </root>于是我开始看dom4j的源代码,在android上dom4j获取到的qName是空字符。通过查看callStack发现android上用的saxparser和PC上saxparser不一样,正在进一步研究中...
sax的官网:http://sax.sourceforge.net/about.html