1. xml中的localName和QName
- <?xmlversion="1.0"encoding="utf-8"?>
- <websites
- xmlns:sina="http://www.sina.com"
- xmlns:baidu="http://www.baidu.com">
-
- sina:websitesina:blog="blog.sina.com">新浪</sina:websitebaidu:websitebaidu: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
copy
>
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"。
2.sax解析localName与qName
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
packagecom.siqi.xml;
-
- importjava.io.File;
- importjava.io.FileReader;
- importjavax.xml.parsers.SAXParser;
- importjavax.xml.parsers.SAXParserFactory;
- importorg.xml.sax.InputSource;
- importorg.xml.sax.XMLReader;
- importorg.xml.sax.helpers.XMLReaderFactory;
- publicclassTestSax{
- staticvoidmain(String...args){
- try{
-
- System.out.println("parsexmlfileusesax2");
- SaxParseHandlersax2Handler=newSaxParseHandler();
- XMLReaderxmlReader=XMLReaderFactory.createXMLReader();
- xmlReader.setContentHandler(sax2Handler);
- xmlReader.setErrorHandler(sax2Handler);
- FileReaderfileReader=newFileReader("./src/sample.xml");
- xmlReader.parse(newInputSource(fileReader));
- //sax1解析XML文档
- System.out.println("parsexmlfileusesax");
- SaxParseHandlersaxHandler= SAXParserparser=SAXParserFactory.newInstance().newSAXParser();
- Filefile=newFile("./src/sample.xml");
- parser.parse(file,saxHandler);
- }catch(Exceptione){
-
- e.printStackTrace();
- }
- }
- }
SaxParseHandler.java
copy
importorg.xml.sax.Attributes;
- importorg.xml.sax.SAXException;
- importorg.xml.sax.helpers.DefaultHandler;
- /**
- *要用sax解析,需要实现一个ParseHandler
- *@authorsiqi
- *
- */
- classSaxParseHandlerextendsDefaultHandler{
- /**
- *重写了DefaultHandler中的startElement函数,每解析到
- *一个元素(element)的时候都会触发这个函数,并且将这个element
- *的属性attributes和值value当作参数传进来。除了startElement,
- *还有startDocument,endDOucment,endElement,要根据需要
- *重写这些函数。
- */
- @Override
- voidstartElement(Stringuri,StringlocalName,StringqName,
- Attributesattributes)throwsSAXException{
- //打印element的基本信息,qName
- System.out.println("ElementqName:"+qName);
- System.out.println("ElementlocalName:"+localName);
- System.out.println("Elementuri:"+uri);
- //打印element的所有属性attributes
- for(inti=0;i<attributes.getLength();i++){
- System.out.println("");
- System.out.println("attributeqName:"+attributes.getQName(i));
- System.out.println("attributelocalName:"+attributes.getLocalName(i));
- System.out.println("attributevalue:"+attributes.getValue(i));
- System.out.println("attributeuri:"+attributes.getURI(i));
- super.startElement(uri,localName,qName,attributes);
-
sample.xml的内容最上面那个xml
执行结果:
copy
parsexmlfileusesax2
- ElementqName:websites
- ElementlocalName:websites
- Elementuri:
- ElementqName:sina:website
- ElementlocalName:website
- Elementuri:http://www.sina.com
- attributeqName:sina:blog
- attributelocalName:blog
- attributevalue:blog.sina.com
- attributeuri:http://www.sina.com
- ElementqName:baidu:website
- ElementlocalName:website
- Elementuri:http://www.baidu.com
- attributeqName:baidu:blog
- attributelocalName:blog
- attributevalue:hi.baidu.com
- attributeuri:http://www.baidu.com
- parsexmlfileusesax
- ElementqName:websites
- ElementlocalName:
- Elementuri:
- attributeqName:xmlns:sina
- attributelocalName:xmlns:sina
- attributevalue:http://www.sina.com
- attributeuri:
- attributeqName:xmlns:baidu
- attributelocalName:xmlns:baidu
- attributevalue:http://www.baidu.com
- attributeuri:
- ElementqName:sina:website
- attributeqName:sina:blog
- attributelocalName:sina:blog
- attributevalue:blog.sina.com
- ElementqName:baidu:website
- ElementlocalName:
- attributeqName:baidu:blog
- attributelocalName:baidu:blog
- attributevalue:hi.baidu.com
- attributeuri:
对于sax2,正确的解析出了qName,LocalName和uri。sax不能识别出前缀和uri,qName=localName。
3.android xml dom4j
在android程序中,我在用dom4j来操作XML文档的时候发现一个问题,用dom4j解析出来的文档attribute名称都是一样的。
例xml为:
copy
xmlversion="1.0"rootxmlns="http://www.w3.org/2001/XMLSchema"elementname="Jim"age="13"score="89">elementroot>
在解析的时候解析出来的内容为
copy
elementname="Jim"name="13"name="89"于是我开始看dom4j的源代码,在android上dom4j获取到的qName是空字符。通过查看callStack发现android上用的saxparser和PC上saxparser不一样,正在进一步研究中...
sax的官网:http://sax.sourceforge.net/about.html
原文链接:http://www.52php.cn/article/p-frmziayb-qn.html (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|