实例034 使用SAX组件解析XML元素属性和属性值

来源:互联网 发布:42u网络机柜尺寸 编辑:程序博客网 时间:2024/05/07 12:59

实例034  使用SAX组件解析XML元素属性和属性值

在XML中每个元素都可能含有属性。属性是针对元素而言的,包含属性名称和属性值。本实例的XML文档中含有两本图书,每本图书都有自己的价格,也就是每个book元素中都包含一个price子元素,但是其内容可能是不一样的。price元素包含两个属性,即unit和unitType。每个price元素既可以有同样的属性,也可以有不同的属性。本实例实现了如何获取XML元素的属性和属性值,如图1.35所示。

 (点击查看大图)图1.35  使用SAX组件解析XML元素属性和属性值SAX每次开始读取XML元素时,startElement()方法都会被执行。使用AttributeSAXParsing类重写 DefaultHandler类的startElement()方法可以获取元素属性和属性值,语法如下。
  1. public void startElement(String uri, String
    localName, String qName,    
    Attributes attributes) throws SAXException 

参数说明

uri:表示XML元素命名空间,在这里就是http://www.mingrisoft.com。

localName:表示XML元素的本地标示符,在这里就是name、publisher、company、author、ISBN等。

qName:表示元素在XML文件中使用的名称,在这里就是book:name、book:publisher、book:company、book:author、book:ISBN等。

attributes:表示当前元素的属性集合。

(1)创建一个XML文档用于SAX解析,代码如下:

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <!--声明XML文档版本与字符编码方式--> 
  3. <book:books xmlns:book="http://www.mingrisoft.com" 
  4. <!--声明命名空间--> 
  5.         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  6.         xsi:schemaLocation="http://www.mingrisoft.com books.xsd"> 
  7.         <!--声明命名空间的存储地址--> 
  8.         <book:book> 
  9.             <book:name>《C#从入门到精通(第2版)》</book:name> 
  10.             <book:publisher>清华大学出版社</book:publisher> 
  11.             <book:company>明日科技</book:company> 
  12.             <book:author>王小科</book:author> 
  13.             <book:ISBN>9787302226628</book:ISBN> 
  14.             <book:price unit="yuan" 
    unitType="RMB">69.80</book:price> 
  15.             <book:url>http://www.mingribook.
    com/bookinfo.php?
    id=227</book:url> 
  16.         </book:book> 
  17.         <book:book> 
  18.             <book:name>《JavaScript开发技术大全》</book:name> 
  19.             <book:publisher>人民邮电出版社</book:publisher> 
  20.             <book:company>明日科技</book:company> 
  21.             <book:author>梁冰</book:author> 
  22.             <book:ISBN>9787115179708</book:ISBN> 
  23.             <book:price unit="yuan" unitType="
    RMB"
    >65.00</book:price> 
  24.             <book:url>http://www.mingribook.
    com/bookinfo.php?
    id=138</book:url> 
  25.         </book:book> 
  26. </book:books> 

(2)创建AttributeSAXParsing类,继承DefaultHandler类,重写startElement()方法读取属性和属性值,再把它们拼成一个字符串存储在List里。一个元素可能有多个属性,所以使用attributes中的getLength()方法,可以获取当前元素属性的个数。在这个属性集合中,getLocalName()方法可获取当前元素第几个属性的名称;getValue()方法中参数是几就表示当前元素的第几个属性值。代码如下:

  1. public void startElement(String uri, String 
    localName, String qName,    Attributes attributes) 
    throws SAXException {  
  2.     //读取属性名称和属性值,保存在List中  
  3.     for (int i = 0; i < attributes.getLength(); i++) {  
  4.         attribute.add(localName + " = " + 
    attributes.getLocalName(i) + ":"+ attributes.getValue(i));  
  5.     }  

(3)创建parseReadFile()方法把AttributeSAXParsing实例传入解析器,实现XML的解析。代码如下:

  1. public void parseReadFile(String pathname) {  
  2.     SAXParser parser;  
  3.     SAXParserFactory factory = SAXParserFactory.
    newInstance();      //获取SAXParserFactory实例  
  4.     try {  
  5.         factory.setValidating(true);  
  6.         factory.setNamespaceAware(true);  
  7.         parser = factory.newSAXParser();      
    //获取SAXParser实例  
  8.         File file = new File(pathname);      
    //获取XML文件  
  9.         parser.parse(file, this);              
    //解析XML文件  
  10.     } catch (ParserConfigurationException e) {  
  11.         e.printStackTrace();  
  12.     } catch (SAXException e) {  
  13.         e.printStackTrace();  
  14.     } catch (IOException e) {  
  15.         e.printStackTrace();  
  16.     }  

(4)创建main()方法,使用AttributeSAXParsing解析books.xml文件,输出属性名称和属性值到控制台。

  1. public static void main(String[] arg) {  
  2.         String pathname = "xmldemo/books.xml";  
  3.         AttributeSAXParsing elementSAXParsing = 
    new AttributeSAXParsing();  
  4.         elementSAXParsing.parseReadFile(pathname); 
    //解析XML文件  
  5.         System.out.println("属性名称和属性值");  
  6.         System.out.println(elementSAXParsing.
    getAttribute());               //输出结果到控制台  
  7.     } 

心法领悟034:使用startElement获取属性的名称和值。

本实例中使用startElement()获取了属性的名称和值。attributes是startElement()方法的一个参数,通过它可以获取当前元素的所有属性集合和属性其他相关信息。例如,使用getIndex()方法获取某个属性的索引值,使用getType()获取某个属性的类型,使用getQName()获取某个属性的XML元素名称等。

原创粉丝点击