Java:XML篇,使用DOM读取并解析XML
1. 描述
- DOM(Document Object Model) DOM 一种独立于平台和语言的方式访问和修改一个文档的内容和结构。
- DOM 采用建立树形结构的方式访问 XML文档,实际上是以面向对象方式描述的文档模型。
- DOM 树在内存中是持久的,程序能对数据和结构作出更改,使用起来也要简单得多。
- DOM 对于特别大的文档,解析和加载整个文档可能很慢且很耗资源。
2. 示范代码
package com.clzhang.sample.xml; import java.io.*; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import javax.xml.transform.OutputKeys; import javax.xml.transform.Source; 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.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; /** * DOM(Document Object Model) DOM 一种独立于平台和语言的方式访问和修改一个文档的内容和结构。 * DOM 采用建立树形结构的方式访问 XML文档,实际上是以面向对象方式描述的文档模型。 * DOM 树在内存中是持久的,程序能对数据和结构作出更改,使用起来也要简单得多。 * DOM 对于特别大的文档,解析和加载整个文档可能很慢且很耗资源。 */ public class DOMTest { // 读取文件测试(其输入是writeXMLFile的输出) public void parseByDOM(String filename) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new File(filename)); NodeList nlDoc = doc.getElementsByTagName("doc"); for (int i = 0; i < nlDoc.getLength(); i++) { Element element = (Element)nlDoc.item(i); System.out.println(element.getNodeName() + "\tid=" + element.getAttribute("id")); for (Node node = element.getFirstChild(); node != null; node = node .getNextSibling()) { if (node.getNodeType() == Node.ELEMENT_NODE) { Element child = (Element) node; String value = child.getTextContent(); System.out.println("\t" + child.getNodeName() + "=" + value); } } System.out.println(); } } // 写入文件测试 public void writeXMLFile(String filename) throws Exception { // 创建对象结构 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document doc = builder.newDocument(); // 先创建根节点 Element root = doc.createElement("add"); doc.appendChild(root); // 将根元素添加到文档上 // 再创建子节点一,并加入些信息 Element element = doc.createElement("doc"); element.setAttribute("id", "1"); Element title = doc.createElement("title"); title.appendChild(doc.createTextNode("维护权益!")); element.appendChild(title); Element content = doc.createElement("content"); content.appendChild(doc.createTextNode("有一个更完善的交流平台,共建美好家园")); element.appendChild(content); root.appendChild(element); // 再创建子节点二,并加入些信息 element = doc.createElement("doc"); element.setAttribute("id", "2"); title = doc.createElement("title"); title.appendChild(doc.createTextNode("不维护权益!")); element.appendChild(title); content = doc.createElement("content"); content.appendChild(doc.createTextNode("没有一个更完善的交流平台,不共建美好家园")); element.appendChild(content); root.appendChild(element); // 输出到文件 Source source = new DOMSource(doc); FileOutputStream fos = new FileOutputStream(filename); OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); Transformer tf = TransformerFactory.newInstance().newTransformer(); tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); tf.transform(source, new StreamResult(osw)); osw.close(); fos.close(); } public static void main(String arge[]) throws Exception { long starttime = System.currentTimeMillis(); DOMTest ins = new DOMTest(); ins.writeXMLFile("bbs.xml"); ins.parseByDOM("bbs.xml"); System.out.println("运行时间:" + (System.currentTimeMillis() - starttime) + " 毫秒"); } }