【转】xml sax localName和qName的区别

今学了一下关于java使用sax解析xml的东西。关于sax,百度给出的解释就很爽。这里贴出连接

http://baike.baidu.com/view/696824.htm

于是乎,关于写了几个小程序找了找解析xml的感觉。对于DefaultHandler类中方法的成员
String uri, String localName, String qName,Attributes attributes 弄的不是很清楚,于是得到下面这片文章感觉讲的蛮清楚的。无节操的贴过来了。

http://blog.csdn.net/wssiqi/article/details/8239357

1. xml中的localName和QName

<?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"。

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"。

测试:

    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);  
        }  
          
    }  

执行结果:(这里只贴出sax2的结果)

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  

搬运完毕。感谢原作者。

 

 

 

 

 

posted @ 2013-04-04 13:56  三更_雨  阅读(638)  评论(0编辑  收藏  举报