java解析xml的几种方式 (二)

2014-11-24 09:44:13 · 作者: · 浏览: 9
rg.w3c.dom.Element;

10. import org.w3c.dom.NamedNodeMap;

11. import org.w3c.dom.Node;

12. import org.w3c.dom.NodeList;

13.

14. /**

15. * 使用递归解析给定的任意一个xml文档并且将其内容输出到命令行上

16. * @author zhanglong

17. *

18. */

19. public class DomTest3

20. {

21. public static void main(String[] args) throws Exception

22. {

23. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

24. DocumentBuilder db = dbf.newDocumentBuilder();

25.

26. Document doc = db.parse(new File("student.xml"));

27. //获得根元素结点

28. Element root = doc.getDocumentElement();

29.

30. parseElement(root);

31. }

32.

33. private static void parseElement(Element element)

34. {

35. String tagName = element.getNodeName();

36.

37. NodeList children = element.getChildNodes();

38.

39. System.out.print("<" + tagName);

40.

41. //element元素的所有属性所构成的NamedNodeMap对象,需要对其进行判断

42. NamedNodeMap map = element.getAttributes();

43.

44. //如果该元素存在属性

45. if(null != map)

46. {

47. for(int i = 0; i < map.getLength(); i++)

48. {

49. //获得该元素的每一个属性

50. Attr attr = (Attr)map.item(i);

51.

52. String attrName = attr.getName();

53. String attrValue = attr.getValue();

54.

55. System.out.print(" " + attrName + "=\"" + attrValue + "\"");

56. }

57. }

58.

59. System.out.print(">");

60.

61. for(int i = 0; i < children.getLength(); i++)

62. {

63. Node node = children.item(i);

64. //获得结点的类型

65. short nodeType = node.getNodeType();

66.

67. if(nodeType == Node.ELEMENT_NODE)

68. {

69. //是元素,继续递归

70. parseElement((Element)node);

71. }

72. else if(nodeType == Node.TEXT_NODE)

73. {

74. //递归出口

75. System.out.print(node.getNodeva lue());

76. }

77. else if(nodeType == Node.COMMENT_NODE)

78. {

79. System.out.print("");

89. }

90. }

91.

92. System.out.print("");

93. }

94. }

SAX:
SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。

SAX 解析器采用了基于事件的模型,它在解析 XML 文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX 对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现。但用 SAX 解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据

Java代码

1. import java.io.File;

2.

3. import javax.xml.parsers.SAXParser;

4. import javax.xml.parsers.SAXParserFactory;

5.

6. import org.xml.sax.Attributes;

7. import org.xml.sax.SAXException;

8. import org.xml.sax.helpers.DefaultHandler;

9.

10. public class SaxTest1

11. {

12. public static void main(String[] args) throws Exception

13. {

14. //step1: 获得SAX解析器工厂实例

15. SAXParserFactory factory = SAXParserFactory.newInstance();

16.

17. //step2: 获得SAX解析器实例

18. SAXParser parser = factory.newSAXParser();

19.

20. //step3: 开始进行解析

21. parser.parse(new File("student.xml"), new MyHandler());

22.

23. }

24. }

25.

26. class MyHandler extends DefaultHandler

27. {

28. @Override

29. public void startDocument() throws SAXException

30. {

31. System.out.println("parse began");

32. }

33.

34. @Override

35. public void endDocument() throws SAXException

36. {

37. System.out.println("parse finished");

38.