您的位置:首页 > 其它

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

2013-09-07 18:00 941 查看
实例034 使用SAX组件解析XML元素属性和属性值

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


(点击查看大图)图1.35 使用SAX组件解析XML元素属性和属性值
SAX每次开始读取XML元素时,startElement()方法都会被执行。使用AttributeSAXParsing类重写 DefaultHandler类的startElement()方法可以获取元素属性和属性值,语法如下。
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解析,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--声明XML文档版本与字符编码方式-->
<book:books xmlns:book="http://www.mingrisoft.com"
<!--声明命名空间-->
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.mingrisoft.com books.xsd">
<!--声明命名空间的存储地址-->
<book:book>
<book:name>《C#从入门到精通(第2版)》</book:name>
<book:publisher>清华大学出版社</book:publisher>
<book:company>明日科技</book:company>
<book:author>王小科</book:author>
<book:ISBN>9787302226628</book:ISBN>
<book:price unit="yuan"
unitType="RMB">69.80</book:price>
<book:url>http://www.mingribook.
com/bookinfo.php?id=227</book:url>
</book:book>
<book:book>
<book:name>《JavaScript开发技术大全》</book:name>
<book:publisher>人民邮电出版社</book:publisher>
<book:company>明日科技</book:company>
<book:author>梁冰</book:author>
<book:ISBN>9787115179708</book:ISBN>
<book:price unit="yuan" unitType="
RMB">65.00</book:price>
<book:url>http://www.mingribook.
com/bookinfo.php?id=138</book:url>
</book:book>
</book:books>


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

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


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

public void parseReadFile(String pathname) {
SAXParser parser;
SAXParserFactory factory = SAXParserFactory.
newInstance();      //获取SAXParserFactory实例
try {
factory.setValidating(true);
factory.setNamespaceAware(true);
parser = factory.newSAXParser();
//获取SAXParser实例
File file = new File(pathname);
//获取XML文件
parser.parse(file, this);
//解析XML文件
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}


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

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


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

本实例中使用startElement()获取了属性的名称和值。attributes是startElement()方法的一个参数,通过它可以获取当前元素的所有属性集合和属性其他相关信息。例如,使用getIndex()方法获取某个属性的索引值,使用getType()获取某个属性的类型,使用getQName()获取某个属性的XML元素名称等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: