SAX解析xml时命名空间以及参数问题
本文以实例形式解释下java利用SAX解析xml时命名空间及其参数问题。
(关于xml使用及命名空间的详细展开,可以参考W3school官方教程,这里提供的是关于主题的敏捷版)
1.命名空间直观感受
首先对命名空间有个直观感受,请看下面的未使用命名空间的xml代码。
清单1-1 :books.xml
[html] view plaincopyprint?
1.
2.
3.
4. Harry Potter
5. J K. Rowling
6.
7.
8. Learning XML
9. Erik T. Ray
10.
11.
Harry Potter
J K. Rowling
Learning XML
Erik T. Ray
然后请看下面使用了命名空间的xml代码。
清单1-2: NameSpaceDemo.xml
[html] view plaincopyprint?
1.
2.
3.
4.
5.
6. Harry Potter
7. J K. Rowling
8.
9.
10.
11. Learning XML
12. Erik T. Ray
13.
14.
Harry Potter
J K. Rowling
Learning XML
Erik T. Ray
可以看出命名空间的形式,就是如下图所示结构:
这里关键几个概念是:
命名空间标识符NamespaceIdentifier
命名空间与java中包机制类似,用来避免在同一文件中包含相同名称但结构不同的元素时可能出现的冲突。命名空间标识符可以使用URL以及其他方式,本例中对应的标识符是
命名空间前缀Prefix
前缀就是命名空间的快捷引用方式,它也称作命名空间的别名(alias)。
本例中对应的是 jd
不带前缀和命名空间的本地名称LocalName (Part)
本例中是booktitle author。
带有别名前缀的限定名QualifiedName (qName)
由别名前缀,冒号以及元素名称组成,这些名称很清晰,可被解析器解析和验证。
本例中是jd:book jd:title
默认命名空间
就是省去前缀的命名空间,这样在后续的
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
写时就不用带上前缀了。例如本例中的
Learning XML
Erik T. Ray
使用的就是默认命名空间。
2.java SAX解析xml参数问题
这里尤其以方法,public void startElement(String uri, String localName, String qName, Attributes attributes) 为例.
uri- 代
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
命名空间的标识符,当元素没有命名空间或者解析器的命名空间支持特性没有打开时是空串。注意,可以使用SAXParserFactory的public void setNamespaceAware(boolean awareness)打开支持命名空间特性。
localName - 代表没有前缀的本地名,当支持命名空间特性没有打开时是空串。
qName - 代表带有前缀的限定名,当限定名不能获取时是空串。
attributes - 与元素相关的属性,如果没有属性,那么就是空的属性对象。
下面给出解析上面带有命名空间的xml文档的实例代码,通过观察结果,更好的理解上述参数。
代码清单:SAXTest.java
[html] view plaincopyprint?
1. package com.learningjava;
2.
3. import java.io.File;
4. import java.util.ArrayList;
5. import javax.xml.parsers.SAXParser;
6. import javax.xml.parsers.SAXParserFactory;
7. import org.xml.sax.Attributes;
8. import org.xml.sax.SAXException;
9. import org.xml.sax.helpers.DefaultHandler;
10.
11. /**
12. * This program illustrate using SAX to parser xml
13. * @author wangdq
14. * 2011-11-7
15. */
16. public class SAXTest {
17. public static void main(String[] args) throws Exception {
18.
19. //step1 : get a parser
20. SAXParserFactory factory = SAXParserFactory.newInstance();
21. factory.setNamespaceAware(true);//performe Namespace processing
22. SAXParser parser = factory.newSAXParser();
23. //step2: create a handler
24. DefaultHandler handler = new DefaultHandler(){
25.
26. @Override
27. public void startElement (String uri, String localName,
28. String qName, Attributes attributes) throws SAXException
29. {
30. System.out.format("uri: %-25s\tlocalname: %-10s\tqname: %-10s%n",uri,localName,qName);
31. if(localName.equals("title")) {
32. title = true;
33. }
34. }
35. @Override
36. public void endElement(String namespaceURI, String localName, String qName)
37. throws SAXException {
38. // End of processing current element
39. if (title) {
40. title = false;
41. }
42. }
43. @Override
44. public void characters(char[] ch, int start, int length) {