在java环境下读取xml文件的方法主要有5种:DOM、SAX、JDOM、JAXB、dom4j
最常用、最好用的dom4j
1.  DOM(Document Object Model)
此 方法主要由W3C提供,它将xml文件全部读入内存中,然后将各个元素组成一棵数据树,以便快速的访问各个节点 。 因此非常消耗系统性能 ,对比较大的文档不适宜采用DOM方法来解析。 DOM API 直接沿袭了 XML 规范。每个结点都可以扩展的基于 Node 的接口,就多态性的观点来讲,它是优秀的,但是在 Java 语言中的应用不方便,并且可读性不强。
实例:
Java代码 
1 l.parsers.*; 
2 //XML解析器接口 
3 import org.w3c.dom.*; 
4 //XML的DOM实现 
5 import XmlDocument; 
6 //写XML文件要用到 
7 DocumentBuilderFactory factory = wInstance(); 
8  //允许名字空间 
9  factory.setNamespaceAware(true); 
10  //允许验证 
11  factory.setValidating(true); 
12  //获得DocumentBuilder的一个实例 
13 try { 
14  DocumentBuilder builder = wDocumentBuilder(); 
15 } catch (ParserConfigurationException pce) { 
println(pce); 
17 //  出异常时输出异常信息,然后退出,下同 
it(1); 
19 } 
20 //解析文档,并获得一个Document实例。 
21 try { 
22 Document doc = builder.parse(fileURI); 
23 } catch (DOMException dom) { 
Message()); 
it(1); 
26 } catch (IOException ioe) { 
println(ioe); 
it(1);     
29 } 
30 //获得根节点StuInfo 
31 Element elmtStuInfo = DocumentElement(); 
32 //得到所有student节点 
33  NodeList nlStudent = ElementsByTagNameNS( 
34                                        strNamespace, "student"); 
35 for (……){ 
36      //当前student节点元素 
37      Element elmtStudent = (Element)nlStudent.item(i); 
38      NodeList nlCurrent =              ElementsByTagNameNS( 
39                                      strNamespace, "name"); 
40 } 
对于读取得方法其实是很简单的,写入xml文件也是一样不复杂。
Java代码 
41 DocumentBuilderFactory factory = wInstance(); 
42 DocumentBuilder builder = null; 
43 try { 
44 builder = factory .newDocumentBuilder(); 
45 } catch (ParserConfigurationException pce) { 
println(pce); 
it(1); 
48 } 
49 Document doc = null; 
50 doc = builder .newDocument(); 
51 //下面是建立XML文档内容的过程, 
52 //先建立根元素"学生花名册" 
53 Element root = ateElement("学生花名册"); 
54 //根元素添加上文档 
55 doc.appendChild(root); 
56 //建立"学生"元素,添加到根元素 
57 Element student = ateElement("学生"); 
58 student.setAttribute("性
别", Sex()); 
59 root.appendChild(student); 
60 //建立"姓名"元素,添加到学生下面,下同 
61 Element name = ateElement("姓名"); 
62 student.appendChild(name); 
63 Text tName = Name()); 
64 name.appendChild(tName); 
65 Element age = ateElement("年龄"); 
66 student.appendChild(age); 
67 Text tAge = ateTextNode(String.Age())); 
68 age.appendChild(tAge); 
2.SAX (Simple API for XML)
此方法主要由XML-DEV 邮件列表的成员开发的,SAX是基于事件的方法,它很类似于标签库的处理机制,在标签开始、结束以及错误发生等等地方调用相应的接口实现方法,不是全部文 档都读入内存。 SAX具有优异的性能和利用更少的存储空间特点。SAX 的设计只考虑了功能的强大性,却没有考虑程序员使用起来是否方便。
使用必须扩展ContentHandler、ErrorHandler、DTDHandler等,但是必须扩展ContentHandler(或者DefaultHandler )。
Java代码 
69 l.sax.*; 
70 public  class  MyContentHandler implements ContentHandler { 
71  … … 
72 } 
73 /**
74      * 当其他某一个调用事件发生时,先调用此方法来在文档中定位。
75      * @param locator
76      */ 
77    public void setDocumentLocator(Locator locator){ 
78    } 
79 /**
80      * 在解析整个文档开始时调用
81      * @throws SAXException
82      */ 
83    public void startDocument() throws SAXException{ 
84        System.out.println("** Student information start **"); 
85    } 
86 /**
87      * 在解析整个文档结束时调用
88      * @throws SAXException
89      */ 
90    public void endDocument() throws SAXException{ 
91        System.out.println("**** Student information end ****"); 
92    } 
93 /**
94      * 在解析名字空间开始时调用
95      * @param prefix
96      * @param uri
97      * @throws SAXException
98      */ 
99    public void startPrefixMapping(String prefix 
100        , String uri) throws SAXException{ 
101    } 
102 /**
103      * 在解析名字空间结束时调用
104      * @param prefix
105      * @throws SAXException
106      */ 
107    public void endPrefixMapping(String prefix) throws SAXException{ 
108    } 
109 /**
110      * 在解析元素开始时调用
111      * @param namespaceURI
112      * @param localName
113      * @param qName
114      * @param atts
115      * @throws SAXException
116      */ 
117    public void startElement(String namespaceURI, String localName 
118        , String qName, Attributes atts) throws SAXException{ 
119    } 
120 /** 在解析元素结束时调用
121      * @param namespaceURI
122      * @param localName 本地名,如student
123      * @param qName 原始名,如LIT:student
124      * @throws SAXE
xception  */ 
125    public void endElement(String namespaceURI, String localName,String qName) throws SAXException{ 
126  if (localName.equals(“student”)){ 
127            System.out.println(localName+":"+currentData); 
128        } 
129 } 
取得元素数据的方法——characters
取得元素数据中的空白的方法——ignorableWhitespace
在解析到处理指令时调用的方法——processingInstruction
当未验证解析器忽略实体时调用的方法——skippedEntity
运行时,只需要使用下列代码:
Java代码 
130 MySAXParser mySAXParser = new MySAXParser(); 
131 mySAXParser.parserXMLFile("l"); 
3.JDOM
JDOM的处理方式有些类似于DOM,但它主要是用SAX实现的 。JDOM用Java的数据类型来定义操作数据树的各个节点 。JDOM的性能也很优越。
Java代码 
132 import org.jdom.*; 
133 import org.jdom.input.*; 
134 import org.jdom.output.*; 
135 SAXBuilder builder = new SAXBuilder(false); 
136 //得到Document 
137 Document doc = builder.build(fileURI); 
138 //名字空间 
139 Namespace ns = Namespace("LIT" , "www.lit.edu/student/ "); 
140 //取得所有LIT:student节点的集合 
141 List lstStudents = Children("student",ns); 
142 for ( … ){ 
143  Element elmtStudent = ((i);  java xml是什么
144  ChildTextTrim("name", ns); 
145 } 
146 //修改 
Child("lessonScore" , ns).setText("100"); 
148 //删除 
veChild("master", ns); 
150 //添加 
151 elmtStuInfo.addContent(new Element("master" , ns).addContent(new Entity("masterName"))); 
152 //输出文档 
153 //第一个参数是缩进字符串,这里是4个空格。 
154 //第二个参数是true,表示需要换行。 
155 XMLOutputter printDoc = new XMLOutputter(" ", true); 
156  printDoc.output(doc, new FileOutputStream("l")); 
4.JAXB (Java And XML Binding)
JAXB 是以SUN为主的一些公司公布的。JAXB将schema(或者DTD)映射为java对象(.java文件),然后使用这些java对象来解析xml文件。需要使用之前生成java文件,因而要有固定的schema,无法处理动态的xml文件。
首先使用xjc命令,生成java文件
xjc  [-options ...]
(生成的文件较多)
Java代码 
157 JAXBContext jc = wInstance(“packageName"); 
158  Unmarshaller unmarshaller = jc.createUnmarshaller(); 
159 Collection collection= (Collection)unmarshaller.unmarshal(new File( "l")); 
160 CollectionType.BooksType booksType =Books(); 
161 List bookList = Book(); 
162 for( … ){ 
163  test.jaxb.BookType book =(test.jaxb.BookType) (i); 
164  System.out.println("Book Name: " + Name().trim()); 
165    System.out.println("Book ISBN: " +  ISBN()); 
166 } 
5.DOM4J
据悉dom4j在xml解析方面是性
能最好的,hibernate等框架都使用它作为解析的工具。
要使用dom4j读写XML文档,需要先下载dom4j包,dom4j在 /
目前最新dom4j包下载地址:nchc.dl.sourceforge/sourceforge/dom4j/dom4j-1.6.1.zip
解开后有两个包,仅操作XML文档的话把dom4j-1.6.1.jar加入工程就可以了,如果需要使用XPath的话还需要加入包jaxen-1.1-beta-7.jar
写了简单的dom4j的使用的demo,以备回忆,有些是dom4j的文挡里例子改编的
使用dom4j解析下面的xml文件。
Xml代码 
167 <?xml version="1.0" encoding="GB2312"?> 
168 
169 <?xml-stylesheet type="text/xsl" href="students.xsl"?> 
170 
171 <students> 
172    <student sn="01"> 
173        <name>张三</name> 
174        <age>18</age> 
175    </student> 
176     
177    <student sn="02"> 
178        <name>李四</name> 
179        <age>20</age> 
180    </student> 
181 </students> 
Parse.java
Java代码 
182 import java.io.File; 
183 
184 import org.dom4j.Attribute; 
185 import org.dom4j.Document; 
186 import org.dom4j.DocumentException; 
187 import org.dom4j.Element; 
188 import org.dom4j.ProcessingInstruction; 
189 import org.dom4j.VisitorSupport; 
190 import org.dom4j.io.SAXReader; 
191 
192 public class Parse { 
193 
194    public static void main(String[] args) { 
195        SAXReader reader = new SAXReader(); 
196        File file = new File("l"); 
197        try { 
198            Document doc = ad(file); 
199            doc.accept(new MyVistor()); 
200        } catch (DocumentException e) { 
201            // TODO Auto-generated catch block 
202            e.printStackTrace(); 
203        } 
204    } 
205 
206    public static class MyVistor extends VisitorSupport { 
207        public void visit(Attribute node) { 
208            System.out.println("Attibute:---" + Name() + "="+ Value()); 
209        } 
210 
211        public void visit(Element node) { 
212            if (node.isTextOnly()) { 
213                System.out.println("Element:---" + Name() + "=" 
214                        + Text()); 
215            }else{ 
216                System.out.println("--------" + Name() + "-------"); 
217            } 
218        } 
219 
220        @Override 
221        public void visit(ProcessingInstruction node) { 
222            System.out.println("PI:"+Target()+" "+Text()); 
223        } 
224    } 
225 } 
使用dom4j来将属性写入xml
Java代码 
226 import java.io.FileWriter; 
227 import java.io.IOException; 
228 
229 import org.dom4j.Document; 
230 import org.dom4j.DocumentHelper; 
231 import org.dom4j.Element; 
232 import org.dom4j.io.OutputFormat; 
233 import org.dom4j.io.XMLWriter; 
234 
235 public class
DWriter { 
236 
237    public static void main(String[] args) { 
238        // TODO Auto-generated method stub 
239        try { 
240            XMLWriter writer = new XMLWriter(new FileWriter("l")); 
241            Document doc = createDoc(); 
242            writer.write(doc); 
243            writer.close(); 
244 
245            // Pretty print the document to System.out 
246            // 设置了打印的格式,将读出到控制台的格式进行美化 
247            OutputFormat format = atePrettyPrint(); 
248            writer = new XMLWriter(System.out, format); 
249            writer.write(doc); 
250 
251        } catch (IOException e) { 
252            // TODO Auto-generated catch block 
253            e.printStackTrace(); 
254        } 
255    } 
256 
257    public static Document createDoc() { 
258        Document doc = ateDocument(); 
259        Element root = doc.addElement("root"); 
260        Element author1 = root.addElement("author").addAttribute("name", 
261                "Kree").addAttribute("location", "UK") 
262                .addText("Kree Strachan"); 
263        Element author2 = root.addElement("author").addAttribute("name", "King") 
264                .addAttribute("location", "US").addText("King McWrirter"); 
265        return doc; 
266    } 
267 } 
使用dom4j写入到l文件的内容
Java代码 
268 <?xml version="1.0" encoding="UTF-8"?> 
269 <root> 
270 <author name="Kree" location="UK">Kree Strachan</author> 
271 <author name="King" location="US">King McWrirter</author> 
272 </root> 

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。