java读取xml文件

在java环境下读取xml文件的方法主要有5种:DOMSAXJDOMJAXBdom4j

最常用、最好用的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 //XMLDOM实现

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 end ****");

92 }

93 /**

94 * 在解析名字空间开始时调用

95 * @param prefix

96 * @param uri

97 * @throws SAXException

98 */

99 publicvoid startPrefixMapping(String prefix

100 , String uri) throws SAXException{

101 }

102 /**

103 * 在解析名字空间结束时调用

104 * @param prefix

105 * @throws SAXException

106 */

107 publicvoid 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 publicvoid 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 SAXException */

125 publicvoid 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("SutInfo.xml");

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.getNamespace("LIT" , "http://www.lit.edu.cn/student/ ");

140 //取得所有LIT:student节点的集合

141 List lstStudents = elmtStuInfo.getChildren("student",ns);

142 for ( … ){

143 Element elmtStudent = (Element)lstStudents.get(i);

144 elmtStudent.getChildTextTrim("name", ns);

145 }

146 //修改

147 elmtLesson.getChild("lessonScore" , ns).setText("100");

148 //删除

149 elmtStuInfo.removeChild("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("StuInfo.xml"));

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 = JAXBContext.newInstance(“packageName");

158 Unmarshaller unmarshaller = jc.createUnmarshaller();

159 Collection collection= (Collection)unmarshaller.unmarshal(new File( "books.xml"));

160 CollectionType.BooksType booksType =collection.getBooks();

161 List bookList = booksType.getBook();

162 for( … ){

163 test.jaxb.BookType book =(test.jaxb.BookType) bookList.get(i);

164 System.out.println("Book Name: " + book.getName().trim());

165 System.out.println("Book ISBN: " + book.getISBN());

166 }

5.DOM4J

据悉dom4j在xml解析方面是性能最好的,hibernate等框架都使用它作为解析的工具。

要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/

目前最新dom4j包下载地址:http://nchc.dl.sourceforge.net/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 <?xmlversion="1.0"encoding="GB2312"?>

168

169 <?xml-stylesheettype="text/xsl"href="students.xsl"?>

170

171 <students>

172 <studentsn="01">

173 <name>张三</name>

174 <age>18</age>

175 </student>

176

177 <studentsn="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 publicclass Parse {

193

194 publicstaticvoid main(String[] args) {

195 SAXReader reader = new SAXReader();

196 File file = new File("src/students.xml");

197 try {

198 Document doc = reader.read(file);

199 doc.accept(new MyVistor());

200 } catch (DocumentException e) {

201 // TODO Auto-generated catch block

202 e.printStackTrace();

203 }

204 }

205

206 publicstaticclass MyVistor extends VisitorSupport {

207 publicvoid visit(Attribute node) {

208 System.out.println("Attibute:---" + node.getName() + "="+ node.getValue());

209 }

210

211 publicvoid visit(Element node) {

212 if (node.isTextOnly()) {

213 System.out.println("Element:---" + node.getName() + "="

214 + node.getText());

215 }else{

216 System.out.println("--------" + node.getName() + "-------");

217 }

218 }

219

220 @Override

221 publicvoid visit(ProcessingInstruction node) {

222 System.out.println("PI:"+node.getTarget()+" "+node.getText());

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 publicclass DWriter {

236

237 publicstaticvoid main(String[] args) {

238 // TODO Auto-generated method stub

239 try {

240 XMLWriter writer = new XMLWriter(new FileWriter("src/author.xml"));

241 Document doc = createDoc();

242 writer.write(doc);

243 writer.close();

244

245 // Pretty print the document to System.out

246 // 设置了打印的格式,将读出到控制台的格式进行美化

247 OutputFormat format = OutputFormat.createPrettyPrint();

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 publicstatic Document createDoc() {

258 Document doc = DocumentHelper.createDocument();

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写入到author.xml文件的内容

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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值