使用DOM来生成xml文档
对于生成xml文档来说需要以下几个类的支持
下面这端代码就是生成图中的xml文档的
package cn.org.kingdom.dom; 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.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; public class DomCreateDemo { public static void main(String[] args) throws Exception { // 建立DocumentBuilderFactory对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = null; Document doc = null; db = dbf.newDocumentBuilder(); doc = db.newDocument(); // 建立节点 Element student = doc.createElement("student"); // 创建属性节点 Node sex = (Node) doc.createAttribute("sex"); // 设置属性节点的值 sex.setNodeValue("男"); // 设置属性节点到student节点上 student.setAttributeNode((Attr) sex); // 建立id节点 Element id = doc.createElement("id"); // 建立名字节点 Element name = doc.createElement("name"); // 建立年龄节点 Element age = doc.createElement("age"); // 为id节点添加内容 id.appendChild(doc.createTextNode("id01")); // 为name节点添加内容 name.appendChild(doc.createTextNode("张三")); // 为年龄节点添加内容 age.appendChild(doc.createTextNode("15")); // 将三个子节点加入到父节点中 student.appendChild(id); student.appendChild(name); student.appendChild(age); // 将根元素加入到根节点上 doc.appendChild(student); // 输出文档到文件 TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = null; t = tf.newTransformer(); // 设置编码 // 创建源t.setOutputProperty(OutputKeys.ENCODING) DOMSource ds = new DOMSource(doc); // 创建目标 StreamResult result = new StreamResult(new File("src/output.xml")); // 输出 t.transform(ds, result); } }
下面再来看一个例子,如何使用DOM来解析任意的XML文档(这里不考虑一些复杂的xml)
xml文档的原型如下
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <persons> <!-- this is comment --> <person id = "p01"> <name>张三</name> <age>15</age> <address>南京市</address> </person> <person id = "p02"> <name>李小龙</name> <age>20</age> <address>美国</address> </person> </persons>
下面是java代码
package cn.org.kingdom.dom; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Attr; import org.w3c.dom.Comment; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /** * 解析整个XML文档 * 递归操作 */ public class TestDemo03 { public static void main(String[] args) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new File("src/test2.xml")); Element root = doc.getDocumentElement(); parseElement(root); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private static void parseElement(Element el) { String tagName =el.getTagName(); NodeList list = el.getChildNodes(); System.out.print("<"+tagName); //判断是否有属性 NamedNodeMap mnm = el.getAttributes(); if(mnm!=null) { for (int i = 0; i < mnm.getLength(); i++) { Attr attr = (Attr) mnm.item(i); String attr_name = attr.getName(); String attr_value = attr.getValue(); System.out.print(" "+attr_name+"=\""+attr_value+"\""); } } System.out.print(">"); for (int i = 0; i < list.getLength(); i++) { Node node = list.item(i); if(node.getNodeType()==node.ELEMENT_NODE) { parseElement((Element) node); }else if(node.getNodeType()==node.TEXT_NODE) { System.out.print(node.getNodeValue()); }else if(node.getNodeType()==node.COMMENT_NODE){ System.out.println("<!--"+((Comment)node).getData()+"-->"); } } System.out.println("</"+tagName+">"); } }
更多内容,请参考Java api