在java环境下读取xml文件的方法主要有4种:DOM、SAX、JDOM、JAXB
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, \;
35.for (??){
36. //当前student节点元素
37. Element elmtStudent = (Element)nlStudent.item(i);
38. NodeList nlCurrent = elmtStudent.getElementsByTagNameNS(
39. strNamespace, \40.}
对于读取得方法其实是很简单的,写入xml文件也是一样不复杂。
Java代码
1. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
2. DocumentBuilder builder = null; 3. try {
4. builder = factory .newDocumentBuilder(); 5. } catch (ParserConfigurationException pce) { 6. System.err.println(pce); 7. System.exit(1); 8. }
9. Document doc = null;
10.doc = builder .newDocument(); 11.//下面是建立XML文档内容的过程, 12.//先建立根元素\学生花名册\
13.Element root = doc.createElement(\学生花名册\14.//根元素添加上文档
15.doc.appendChild(root);
16.//建立\学生\元素,添加到根元素
17.Element student = doc.createElement(\学生\
18.student.setAttribute(\性别\19.root.appendChild(student);
20.//建立\姓名\元素,添加到学生下面,下同 21.Element name = doc.createElement(\姓名\22.student.appendChild(name);
23.Text tName = doc.createTextNode(studentBean.getName());
24.name.appendChild(tName);
25.Element age = doc.createElement(\年龄\26.student.appendChild(age);
27.Text tAge = doc.createTextNode(String.valueOf(studentBean.getAge()));
28.age.appendChild(tAge); 2.SAX (Simple API for XML)
此方法主要由XML-DEV 邮件列表的成员开发的,SAX是基于事件的方法,它很类似于标签库的处理机制,在标签开始、结束以及错误发生等等地方调用相应的接口实现方法,不是全部文 档都读入内存。 SAX具有优异的性能和利用更少的存储空间特点。SAX 的设计只考虑了功能的强大性,却没有考虑程序员使用起来是否方便。
使用必须扩展ContentHandler、ErrorHandler、DTDHandler等,但是必须扩展ContentHandler(或者DefaultHandler )。
Java代码
1. import org.xml.sax.*;
2. public class MyContentHandler implements ContentHandler { 3. ? ? 4. } 5. /**
6. * 当其他某一个调用事件发生时,先调用此方法来在文档中定位。 7. * @param locator 8. */
9. public void setDocumentLocator(Locator locator){ 10. } 11./**
12. * 在解析整个文档开始时调用 13. * @throws SAXException 14. */
15. public void startDocument() throws SAXException{
16. System.out.println(\
17. } 18./**
19. * 在解析整个文档结束时调用 20. * @throws SAXException 21. */
22. public void endDocument() throws SAXException{
23. System.out.println(\;
24. } 25./**
26. * 在解析名字空间开始时调用 27. * @param prefix 28. * @param uri
29. * @throws SAXException 30. */
31. public void startPrefixMapping(String prefix 32. , String uri) throws SAXException{ 33. } 34./**
35. * 在解析名字空间结束时调用 36. * @param prefix
37. * @throws SAXException 38. */
39. public void endPrefixMapping(String prefix) throws SAXException{ 40. } 41./**
42. * 在解析元素开始时调用 43. * @param namespaceURI 44. * @param localName 45. * @param qName 46. * @param atts
47. * @throws SAXException 48. */
49. public void startElement(String namespaceURI, String localName
50. , String qName, Attributes atts) throws SAXException{
51. }
52./** 在解析元素结束时调用 53. * @param namespaceURI
54. * @param localName 本地名,如student 55. * @param qName 原始名,如LIT:student 56. * @throws SAXException */
57. public void endElement(String namespaceURI, String localName,String qName) throws SAXException{ 58. if (localName.equals(“student”)){
59. System.out.println(localName+\60. }
61.}
取得元素数据的方法——characters
取得元素数据中的空白的方法——ignorableWhitespace 在解析到处理指令时调用的方法——processingInstruction 当未验证解析器忽略实体时调用的方法——skippedEntity 运行时,只需要使用下列代码:
Java代码
1. MySAXParser mySAXParser = new MySAXParser(); 2. mySAXParser.parserXMLFile(\ 3.JDOM
JDOM的处理方式有些类似于DOM,但它主要是用SAX实现的 。JDOM用Java的数据类型来定义操作数据树的各个节点 。JDOM的性能也很优越。
Java代码
1. import org.jdom.*;
2. import org.jdom.input.*; 3. import org.jdom.output.*;
4. SAXBuilder builder = new SAXBuilder(false); 5. //得到Document
6. Document doc = builder.build(fileURI); 7. //名字空间
8. Namespace ns = Namespace.getNamespace(\du.cn/student/ \
9. //取得所有LIT:student节点的集合
10.List lstStudents = elmtStuInfo.getChildren(\11.for ( ? ){
12. Element elmtStudent = (Element)lstStudents.get(i); 13. elmtStudent.getChildTextTrim(\14.}
15.//修改
16.elmtLesson.getChild(\17.//删除
18.elmtStuInfo.removeChild(\