加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml sax localName和qName的区别

发布时间:2020-12-16 05:56:56 所属栏目:百科 来源:网络整理
导读:xml sax localName和qName的区别 分类:XML 2012-11-29 17:59 916人阅读 评论(3) 收藏 举报 localname qname SAX sax xml XML 目录(?) [+] 1. xml中的localName和QName [html] view plain copy ? xml version = "1.0" encoding = "utf-8" ? websites xmlns:s

xml sax localName和qName的区别

分类:XML 916人阅读 评论(3) 收藏 举报
localname qname SAX sax xml XML

目录(?)[+]

1. xml中的localName和QName

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <websites
  3. xmlns:sina="http://www.sina.com"
  4. xmlns:baidu="http://www.baidu.com">
  5. sina:websitesina:blog="blog.sina.com">新浪</sina:websitebaidu:websitebaidu:blog="hi.baidu.com">百度baidu:website>
  6. 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

[java] copy
    packagecom.siqi.xml;
  1. importjava.io.File;
  2. importjava.io.FileReader;
  3. importjavax.xml.parsers.SAXParser;
  4. importjavax.xml.parsers.SAXParserFactory;
  5. importorg.xml.sax.InputSource;
  6. importorg.xml.sax.XMLReader;
  7. importorg.xml.sax.helpers.XMLReaderFactory;
  8. publicclassTestSax{
  9. staticvoidmain(String...args){
  10. try{
  11. //Sax2解析XML文档
  12. System.out.println("parsexmlfileusesax2");
  13. SaxParseHandlersax2Handler=newSaxParseHandler();
  14. XMLReaderxmlReader=XMLReaderFactory.createXMLReader();
  15. xmlReader.setContentHandler(sax2Handler);
  16. xmlReader.setErrorHandler(sax2Handler);
  17. FileReaderfileReader=newFileReader("./src/sample.xml");
  18. xmlReader.parse(newInputSource(fileReader));
  19. //sax1解析XML文档
  20. System.out.println("parsexmlfileusesax");
  21. SaxParseHandlersaxHandler= SAXParserparser=SAXParserFactory.newInstance().newSAXParser();
  22. Filefile=newFile("./src/sample.xml");
  23. parser.parse(file,saxHandler);
  24. }catch(Exceptione){
  25. //TODOAuto-generatedcatchblock
  26. e.printStackTrace();
  27. }
  28. }
  29. }

SaxParseHandler.java

copy
    importorg.xml.sax.Attributes;
  1. importorg.xml.sax.SAXException;
  2. importorg.xml.sax.helpers.DefaultHandler;
  3. /**
  4. *要用sax解析,需要实现一个ParseHandler
  5. *@authorsiqi
  6. *
  7. */
  8. classSaxParseHandlerextendsDefaultHandler{
  9. /**
  10. *重写了DefaultHandler中的startElement函数,每解析到
  11. *一个元素(element)的时候都会触发这个函数,并且将这个element
  12. *的属性attributes和值value当作参数传进来。除了startElement,
  13. *还有startDocument,endDOucment,endElement,要根据需要
  14. *重写这些函数。
  15. */
  16. @Override
  17. voidstartElement(Stringuri,StringlocalName,StringqName,
  18. Attributesattributes)throwsSAXException{
  19. //打印element的基本信息,qName
  20. System.out.println("ElementqName:"+qName);
  21. System.out.println("ElementlocalName:"+localName);
  22. System.out.println("Elementuri:"+uri);
  23. //打印element的所有属性attributes
  24. for(inti=0;i<attributes.getLength();i++){
  25. System.out.println("");
  26. System.out.println("attributeqName:"+attributes.getQName(i));
  27. System.out.println("attributelocalName:"+attributes.getLocalName(i));
  28. System.out.println("attributevalue:"+attributes.getValue(i));
  29. System.out.println("attributeuri:"+attributes.getURI(i));
  30. super.startElement(uri,localName,qName,attributes);
  31. }


sample.xml的内容最上面那个xml
执行结果:
copy
    parsexmlfileusesax2
  1. ElementqName:websites
  2. ElementlocalName:websites
  3. Elementuri:
  4. ElementqName:sina:website
  5. ElementlocalName:website
  6. Elementuri:http://www.sina.com
  7. attributeqName:sina:blog
  8. attributelocalName:blog
  9. attributevalue:blog.sina.com
  10. attributeuri:http://www.sina.com
  11. ElementqName:baidu:website
  12. ElementlocalName:website
  13. Elementuri:http://www.baidu.com
  14. attributeqName:baidu:blog
  15. attributelocalName:blog
  16. attributevalue:hi.baidu.com
  17. attributeuri:http://www.baidu.com
  18. parsexmlfileusesax
  19. ElementqName:websites
  20. ElementlocalName:
  21. Elementuri:
  22. attributeqName:xmlns:sina
  23. attributelocalName:xmlns:sina
  24. attributevalue:http://www.sina.com
  25. attributeuri:
  26. attributeqName:xmlns:baidu
  27. attributelocalName:xmlns:baidu
  28. attributevalue:http://www.baidu.com
  29. attributeuri:
  30. ElementqName:sina:website
  31. attributeqName:sina:blog
  32. attributelocalName:sina:blog
  33. attributevalue:blog.sina.com
  34. ElementqName:baidu:website
  35. ElementlocalName:
  36. attributeqName:baidu:blog
  37. attributelocalName:baidu:blog
  38. attributevalue:hi.baidu.com
  39. 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读