xml sax localName和qName的区别

前端之家收集整理的这篇文章主要介绍了xml sax localName和qName的区别前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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不一样,正在进一步研究中... 原文链接:https://www.f2er.com/xml/298058.html

      猜你在找的XML相关文章