java读写XML文件
在这里呢,我只介绍一种读写XML文件的方法,因为目前为止,我只会一种。不过,经过我的测试,读写程序都是能正常运行的。
java操作XML文档主要有四种方式,分别是DOM、SAX、JDOM和DOM4J,DOM和SAX是官方提供的,而JDOM和DOM4J则是引用第三方库的。
我写的是使用DOM方式读写XML文件,当XML文件较大时,请出门右拐,去找SAX如何使用。
<?xml version="1.0" encoding="utf-8"?>
<bookstore>
<book category="science">
<title lang="en">三体</title>
<author>刘慈欣</author>
<year>2010</year>
<price>39.99</price>
</book>
<book category="history">
<title lang="en">史记</title>
<author>司马迁</author>
<year>200</year>
<price>30.00</price>
</book>
</bookstore>
读XML文件:
package TT02;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
public class ReadXML01 {
public static void useDomReadXml(String soucePath){
File file = new File(soucePath);// 把要解析的 XML 文档转化为输入流,以便 DOM 解析器解析它
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回
//调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂
DocumentBuilder builder = factory.newDocumentBuilder();
//调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象
Document doc = builder.parse(file);
// 调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了
org.w3c.dom.NodeList nlst = doc.getElementsByTagName("book");
// 得到 XML 文档的根节点
//遍历集合内容
for (int i = 0; i < ((org.w3c.dom.NodeList) nlst).getLength(); i++) {
String title = doc.getElementsByTagName("title").item(i).getFirstChild().getNodeValue();
String creater = doc.getElementsByTagName("author").item(i).getFirstChild().getNodeValue();
String year = doc.getElementsByTagName("year").item(i).getFirstChild().getNodeValue();
String price = doc.getElementsByTagName("price").item(i).getFirstChild().getNodeValue();
// 得到节点的子节点
System.err.println("标题" + title);
System.err.println("作者" + creater);
System.err.println("年份" + year);
System.err.println("价格" + price);
System.err.println("");}
} catch (Exception e) {
System.err.println("读取该xml文件失败");
e.printStackTrace();
}
}
}
package TT02;
public class ReadXML02 {
public static void main(String[] args) throws Exception {
String soucePath = "D:\\Java源计划\\Lianxi\\src\\TT02\\001.xml";
ReadXML01.useDomReadXml(soucePath);
// 读取xml内部节点集合
}
}
写XML文件:
<?xml version="1.0" encoding="UTF-8"?><bookstore>
<book category="children">
<title>狼王梦</title>
<author>沈石溪</author>
<year>2008</year>
<price>28.88</price>
</book>
</bookstore>
package TT02;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
public class WriteXML01 {
public static void insertXML(String soucePath) {
Element bookstore;
Element book;
Element title = null;
Element author = null;
Element year = null;
Element price = null;
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法
// ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回
// 调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂
DocumentBuilder builder = factory.newDocumentBuilder();
// 调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象
Document doc=builder.newDocument();
// 对象,进行可以利用DOM特性对整个XML文档进行操作了
doc.setXmlStandalone(true);
bookstore = doc.createElement("bookstore");
book=doc.createElement("book");
book.setAttribute("category","children");
title=doc.createElement("title");
title.appendChild(doc.createTextNode("狼王梦"));
book.appendChild(title);
author=doc.createElement("author");
author.appendChild(doc.createTextNode("沈石溪"));
book.appendChild(author);
year=doc.createElement("year");
year.appendChild(doc.createTextNode("2008"));
book.appendChild(year);
price=doc.createElement("price");
price.appendChild(doc.createTextNode("28.88"));
book.appendChild(price);
bookstore.appendChild(book);
doc.appendChild(bookstore);
TransformerFactory tff=TransformerFactory.newInstance();
Transformer tf=tff.newTransformer();
tf.setOutputProperty(OutputKeys.INDENT,"yes");
tf.transform(new DOMSource(doc), new StreamResult(new File(soucePath)));
System.out.println("成功");
} catch (Exception e) {
System.err.println("写入该xml文件失败");
e.printStackTrace();
}
}
}
package TT02;
public class WriteXML02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String soucePath="D:\\Java源计划\\Lianxi\\src\\TT02\\002.XML";
WriteXML01.insertXML(soucePath);
}
}
(注:xml文件内的原本内容会被覆盖,所以建议只用于新建文件是的写,而不是现已有信息的文件添加新信息。)