java读取xml文件(一)

2014-11-24 01:19:41 · 作者: · 浏览: 0

在java环境下读取xml文件的方法主要有5种:DOM、SAX、JDOM、JAXB、dom4j

最常用、最好用的dom4j
1. DOM(Document Object Model)


此 方法主要由W3C提供,它将xml文件全部读入内存中,然后将各个元素组成一棵数据树,以便快速的访问各个节点 。 因此非常消耗系统性能 ,对比较大的文档不适宜采用DOM方法来解析。 DOM API 直接沿袭了 XML 规范。每个结点都可以扩展的基于 Node 的接口,就多态性的观点来讲,它是优秀的,但是在 Java 语言中的应用不方便,并且可读性不强。
实例:

Java代码

1 import javax.xml.parsers.*;

2 //XML解析器接口

3 import org.w3c.dom.*;

4 //XML的DOM实现

5 import org.apache.crimson.tree.XmlDocument;

6 //写XML文件要用到

7 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

8 //允许名字空间

9 factory.setNamespaceAware(true);

10 //允许验证

11 factory.setValidating(true);

12 //获得DocumentBuilder的一个实例

13 try {

14 DocumentBuilder builder = factory.newDocumentBuilder();

15 } catch (ParserConfigurationException pce) {

16 System.err.println(pce);

17 // 出异常时输出异常信息,然后退出,下同

18 System.exit(1);

19 }

20 //解析文档,并获得一个Document实例。

21 try {

22 Document doc = builder.parse(fileURI);

23 } catch (DOMException dom) {

24 System.err.println(dom.getMessage());

25 System.exit(1);

26 } catch (IOException ioe) {

27 System.err.println(ioe);

28 System.exit(1);

29 }

30 //获得根节点StuInfo

31 Element elmtStuInfo = doc.getDocumentElement();

32 //得到所有student节点

33 NodeList nlStudent = elmtStuInfo.getElementsByTagNameNS(

34 strNamespace, "student");

35 for (……){

36 //当前student节点元素

37 Element elmtStudent = (Element)nlStudent.item(i);

38 NodeList nlCurrent = elmtStudent.getElementsByTagNameNS(

39 strNamespace, "name");

40 }

对于读取得方法其实是很简单的,写入xml文件也是一样不复杂。

Java代码

41 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

42 DocumentBuilder builder = null;

43 try {

44 builder = factory .newDocumentBuilder();

45 } catch (ParserConfigurationException pce) {

46 System.err.println(pce);

47 System.exit(1);

48 }

49 Document doc = null;

50 doc = builder .newDocument();

51 //下面是建立XML文档内容的过程,

52 //先建立根元素"学生花名册"

53 Element root = doc.createElement("学生花名册");

54 //根元素添加上文档

55 doc.appendChild(root);

56 //建立"学生"元素,添加到根元素

57 Element student = doc.createElement("学生");

58 student.setAttribute("性别", studentBean.getSex());

59 root.appendChild(student);

60 //建立"姓名"元素,添加到学生下面,下同

61 Element name = doc.createElement("姓名");

62 student.appendChild(name);

63 Text tName = doc.createTextNode(studentBean.getName());

64 name.appendChild(tName);

65 Element age = doc.createElement("年龄");

66 student.appendChild(age);

67 Text tAge = doc.createTextNode(String.valueOf(studentBean.getAge()));

68 age.appendChild(tAge);

2.SAX (Simple API for XML)

此方法主要由XML-DEV 邮件列表的成员开发的,SAX是基于事件的方法,它很类似于标签库的处理机制,在标签开始、结束以及错误发生等等地方调用相应的接口实现方法,不是全部文 档都读入内存。 SAX具有优异的性能和利用更少的存储空间特点。SAX 的设计只考虑了功能的强大性,却没有考虑程序员使用起来是否方便。

使用必须扩展ContentHandler、ErrorHandler、DTDHandler等,但是必须扩展ContentHandler(或者DefaultHandler )。

Java代码

69 import org.xml.sax.*;

70 public class MyContentHandler implements ContentHandler {

71 … …

72 }

73 /**

74 * 当其他某一个调用事件发生时,先调用此方法来在文档中定位。

75 * @param locator

76 */

77 publicvoid setDocumentLocator(Locator locator){

78 }

79 /**

80 * 在解析整个文档开始时调用

81 * @throws SAXException

82 */

83 publicvoid startDocument() throws SAXException{

84 System.out.println("** Student information start **");

85 }

86 /**

87 * 在解析整个文档结束时调用

88 * @throws SAXException

89 */

90 publicvoid endDocument() throws SAXException{

91 System.out.println("**** Student information en