1. Parsing XML
2.
3. 或许你想要做的第一件事情就是解析一个某种类型的XML文档,用dom4j很容易做到。请看下面的示范代码:
4.
5. import java.net.URL;
6.
7. import org.dom4j.Document;
8. import org.dom4j.DocumentException;
9. import org.dom4j.io.SAXReader;
10.
11. public class Foo {
12.
13. public Document parse(URL url) throws DocumentException {
14. SAXReader reader = new SAXReader();
15. Document document = reader.read(url);
16. return document;
17. }
18. }
19. 使用迭代器(Iterators)
20. 我们可以通过多种方法来操作XML文档,这些方法返回java 里标准的迭代器(Iterators)。例如:
21.
22. public void bar(Document document) throws DocumentException {
23. Element root = document.getRootElement();
24. //迭代根元素下面的所有子元素
25. for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
26. Element element = (Element) i.next();
27. //处理代码
28. }
29.
30. //迭代根元素下面名称为"foo"的子元素
31. for ( Iterator i = root.elementIterator( "foo" ); i.hasNext(); ) {
32. Element foo = (Element) i.next();
33. //处理代码
34. }
35.
36. // 迭代根元素的属性attributes)元素
37. for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
38. Attribute attribute = (Attribute) i.next();
39. // do something
40. }
41. }
42. 强大的XPath导航
43. 在dom4j中XPath可以表示出在XML树状结构中的Document 或者任意的节点(Node)(例如:Attribute,Element 或者ProcessingInstruction等)。它可以使在文档中复杂的操作仅通过一行代码就可以完成。例如:
44.
45. public void bar(Document document) {
46. List list = document.selectNodes( "//foo/bar" );
47. Node node = document.selectSingleNode( "//foo/bar/author" );
48. String name = node.valueOf( "@name" );
49. }
50.
51. 如果你想得到一个XHTML文档中的所有超文本链接(hypertext links)你可以使用下面的代码:
52.
53. public void findLinks(Document document) throws DocumentException {
54.
55. List list = document.selectNodes( "//a/@href" );
56.
57. for (Iterator iter = list.iterator(); iter.hasNext(); ) {
58. Attribute attribute = (Attribute) iter.next();
59. String url = attribute.getValue();
60. }
61. }
62. 如果你需要关于XPath语言的任何帮助,我们强烈推荐这个站点Zvon tutorial他会通过一个一个的例子引导你学习。
63. 快速遍历(Fast Looping)
64. 如果你不得不遍历一个非常大的XML文档,然后才去执行,我们建议你使用快速遍历方法(fast looping method),它可以避免为每一个循环的节点创建一个迭代器对象,如下所示:
65.
66. public void treeWalk(Document document) {
67. treeWalk( document.getRootElement() );
68. }
69.
70. public void treeWalk(Element element) {
71. for ( int i = 0, size = element.nodeCount(); i < size; i++ ) {
72. Node node = element.node(i);
73. if ( node instanceof Element ) {
74. treeWalk( (Element) node );
75. }
76. else {
77. // do something....
78. }
79. }
80. }
81. 生成一个新的XML文档对象
82. 在dom4j中你可能常常希望用程序生成一个XML文档对象,下面的程序为你进行了示范:
83.
84. import org.dom4j.Document;
85. import org.dom4j.DocumentHelper;
86. import org.dom4j.Element;
87.
88. public class Foo {
89.
90. public Document createDocument() {
91. Document document = DocumentHelper.createDocument();
92. Element root = document.addElement( "root" );
93.
94. Element author1 = root.addElement( "author" )
95. .addAttribute( "name", "James" )
96. .addAttribute( "location", "UK" )
97. .addText( "James Strachan" );
98.
99. Element author2 = root.addElement( "author" )
100. .addAttribute( "name", "Bob" )
101. .addAttribute( "location", "US" )
102. .addText( "Bob McWhirter" );
103.
104. return document;
105. }
106. }
107. 将一个文档对象写入文件中
108. 将一个文档对象写入Writer对象的一个简单快速的途径是通过 write()方法。
109.
110. FileWriter out = new FileWriter( "foo.xml" );
111. document.write( out );
112.
113. 如果你想改变输出文件的排版格式,比如你想要一个漂亮的格式或者是一个紧凑的格式,或者你想用Writer 对象或者OutputStream 对象来操作,那么你可以使用XMLWriter 类。
114.
115. import org.dom4j.Document;
116. import org.dom4j.io.OutputFormat;
117. import org.dom4j.io.XMLWriter;
118.
119. public class Foo {
120.
121. public void write(Document document) throws IOException {
122.
123. // 写入文件
124. XMLWriter writer = new XMLWriter(
125. new FileWriter( "output.xml" )
126. );
127. writer.write( document );
128. writer.close();
129.
130.
131. // 以一种优雅的格式写入System.out对象
132. OutputFormat format = OutputFormat.createPrettyPrint();
133. writer = new XMLWriter( System.out, format );
134. writer.write( document );
135.
136. // 以一种紧凑的格式写入System.out对象
137. format = OutputFormat.createCompactFormat();
138. writer = new XMLWriter( System.out, format );
139. writer.write( document );
140. }
141. }
142. 转化为字符串,或者从字符串转化
143. 如果你有一个文档(Document)对象或者任何一个节点(Node)对象的引用(reference),象属性(Attribute)或者元素(Element),你可以通过asXML()方法把它转化为一个默认的XML字符串:
144.
145. Document document = ...;
146. String text = document.asXML();
147.
148. 如果你有一些XML内容的字符串表示,你可以通过DocumentHelper.parseText()方法将它重新转化为文档(Document)对象:
149.
150. String text = "<person> <name>James</name> </person>";
151. Document document = DocumentHelper.parseText(text);
152. 通过XSLT样式化文档(Document)
153. 使用Sun公司提供的JAXP API将 XSLT 应用到文档(Document)上是很简单的。它允许你使用任何的XSLT引擎(例如:Xalan或SAXON等)来开发。下面是一个使用 JAXP创建一个转化器(transformer),然后将它应用到文档(Document)上的例子:
154.
155. import javax.xml.transform.Transformer;
156. import javax.xml.transform.TransformerFactory;
157.
158. import org.dom4j.Document;
159. import org.dom4j.io.DocumentResult;
160. import org.dom4j.io.DocumentSource;
161.
162. public class Foo {
163.
164. public Document styleDocument(
165. Document document,
166. String stylesheet
167. ) throws Exception {
168.
169. // 使用 JAXP 加载转化器
170. TransformerFactory factory = TransformerFactory.newInstance();
171. Transformer transformer = factory.newTransformer(
172. new StreamSource( stylesheet )
173. );
174.
175. // 现在来样式化一个文档(Document)
176. DocumentSource source = new DocumentSource( document );
177. DocumentResult result = new DocumentResult();
178. transformer.transform( source, result );
179.
180. // 返回经过样式化的文档(Document)
181. Document transformedDoc = result.getDocument();
182. return transformedDoc;
183. }
184. }