使用DOM方法实现xml文档内容的解析与写入

java中对xml文档的解析可以分为四种方式:DOM、JDOM、SAX、DOM4J

这里研究一下使用DOM方式进行xml文档的写入和解析的方法。


DOM解析XML文档时会遍历整个XML文档,在内存中建立一个树的数据结构。与JavaScriptDOM方法类似,我们可以通过getElementsByTagName方法获取到特定的标签对象,当然,同样的标签很多的话要使用List来存储返回的多个标签对象。另外通过DOMXML文档也很方便,创建了节点之后依次连接到父节点上就OK了,最后通过Transformer把驻留在内存中建立好的DOM树通过io流写入到特定文本就OK

使用DOM方式进行XML解析——

创建了一份简单的xml文档

eclipse中新建项目DOM_Test,并把该xml文档拷贝到工程目录下。在代码中利用documentBuilder的parse方法可以传入需要被解析的XML文档。最后把解析出的元素输出,控制台输出结果贴个图:

附上 DOM解析XML文档的java代码demo:

public class DOM_Test {

	public static void main(String[] args) {
		//创建一个documentBuilderFactory对象
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		//创建一个documentBuilder对象
		try {
			DocumentBuilder db = dbf.newDocumentBuilder();
			//通过documentBuilder对象的parse方法加载book.xml到当前项目下
			Document document = db.parse("book.xml");//传入需要被解析的XML文档的URI
			//获取所有book节点的集合
			NodeList bookList = document.getElementsByTagName("book");//通过标签获取元素
			System.out.println("查询到有:"+bookList.getLength()+"本书");
			for (int i = 0; i < bookList.getLength(); i++) {
				System.out.println("===========下面开始遍历第"+(i+1)+"本书的内容============");
				Element book = (Element) bookList.item(i);
				String value = book.getAttribute("id");
				System.out.println("属性id的值为:"+value);
				//解析book节点和子节点
				Node book_node = bookList.item(i);
				NodeList childlist = book_node.getChildNodes();
				System.out.println("第"+(i+1)+"本书共有"+childlist.getLength()+"个子节点");
				for (int j = 0; j < childlist.getLength(); j++) {
					if (childlist.item(j).getNodeType() == Node.ELEMENT_NODE) {
						System.out.print("第"+(j+1)+"个节点的节点名:");
						System.out.println(childlist.item(j).getNodeName()+" ---> "+
								childlist.item(j).getFirstChild().getTextContent());
					}
				}
				System.out.println("============book "+(i+1)+"  END==================");
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

}

============================================================================

使用DOM方式进行XML创建和写入:

同理,利用documentBuilder就可以对xml文档进行build。在代码中创建好标签元素Element,并将其按照顺序通过append方法连接起来,运行时在内存中就会构建一个DOM树,最后用Transformer建立一个IO流把DOM树写入到目标文档里。

这是通过DOM创建的一份XML文档——


附上DOM创建写入XML文档的java代码demo:

public class DOM_Write {
	public DocumentBuilder getDocumentBuilder(){
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = null;
		try {
			db = dbf.newDocumentBuilder();
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return db;
	}
	public void createXML(){
		DocumentBuilder db = getDocumentBuilder();
		Document document = db.newDocument();
		document.setXmlStandalone(true);
		Element bookstore = document.createElement("bookstore");
		//向bookstore中添加子节点book
		//创建子节点
		Element book = document.createElement("book");
		Element name = document.createElement("name");
		Element author = document.createElement("author");
		Element year = document.createElement("year");
		Element publishing = document.createElement("publishing");
		//给子节点赋值
		name.setTextContent("退一步,并不难");
		author.setTextContent("达照");
		year.setTextContent("2015");
		publishing.setTextContent("中国商业出版社");
		//把子节点都连接到父节点上
		book.appendChild(name);
		book.appendChild(author);
		book.appendChild(year);
		book.appendChild(publishing);
		book.setAttribute("id", "3");
		//把book节点添加到bookstore中
		bookstore.appendChild(book);
		//把bookstore节点(包含book)添加到DOM树中
		document.appendChild(bookstore); 
		
		//创建TransformerFactory对象
		TransformerFactory tff = TransformerFactory.newInstance();
		try {
			//创建Transformer对象
			Transformer tf = tff.newTransformer();
			tf.setOutputProperty(OutputKeys.INDENT, "yes");//换行
			tf.transform(new DOMSource(document), new StreamResult(new File("book1.xml")));
		} catch (TransformerConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		DOM_Write write = new DOM_Write();
		write.createXML();
	}
}

有一个注意事项,在eclipse中创建document对象和element对象时候需要进行导包,这里导入的包应该是org.w3c.dom.Document和org.w3c.dom.Element,否则没有提供操纵XML的api,会报错。此demo里需要导入的剩下的包都是javax.xml下的包。

最近在学习web service。发现在service发布方和service使用方,都涉及到大量的xml的解析和写入。故做此博客,做学习过程中的一个小结。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章