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文件内的原本内容会被覆盖,所以建议只用于新建文件是的写,而不是现已有信息的文件添加新信息。)