XML解析-----DOM

来源:互联网 发布:奥斯曼近卫军 知乎 编辑:程序博客网 时间:2024/06/10 15:16

部分代码参考了其他博客文章,将之列出来便于以后参考:

1.http://www.cnblogs.com/xiaopeipei/p/3857750.html

2.http://blog.csdn.net/gavin_john/article/details/51694615

DOM(DocumentObject Model)w3c提供的接口,是将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作

优点:1.整棵树都在内存中,可以进行随机访问

2.可以对XML文档进行修改操作

3.sax,dom相比使用较为简单

缺点:

1.整个文档必须一次性解析完

2.整个文档都需要载入内存,对于较大的文档资源消耗较高


测试XML文件:

test.xml:

<?xml version="1.0" encoding="UTF-8"?>  <university name="pku">          <college name="c1">                  <class name="class1">                          <student name="stu1" sex='male' age="21" />                          <student name="stu2" sex='female' age="20" />                          <student name="stu3" sex='female' age="20" />                  </class>                  <class name="class2">                          <student name="stu4" sex='male' age="19" />                          <student name="stu5" sex='female' age="20" />                          <student name="stu6" sex='female' age="21" />                  </class>          </college>          <college name="c2">                  <class name="class3">                          <student name="stu7" sex='male' age="20" />                  </class>          </college>          <college name="c3">          </college>  </university>  
Dom.java

package xml.dom;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerConfigurationException;import javax.xml.transform.TransformerException;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.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.w3c.dom.Text;import org.xml.sax.SAXException;/** * 使用Dom读写XML *  * 步骤:(读) * 1.新建 DocumentBuilderFactory * 2.新建 DocumentBuilder * 3.新建 InputStream:读入XML文件 * 4.Document doc = builder.parse(in); 将XML文件解析为Document * 5.Dom会将文件加载到内存中,因此可以进行随机访问,详情看代码 *  * (写,这里是修改test.xml文件并保存到另外一个文件中) * 1.新建DocumentBuilderFactory * DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); * 2.新建DocumentBuilder * DocumentBuilder builder = dbf.newDocumentBuilder(); * 3.输入流 InputStream读取test.xml * InputStream in = TestDom.class.getClassLoader().getResourceAsStream("test.xml"); * 4.解析为Document * Document doc = builder.parse(in); * 5.获取根节点(这步开始可以根据自己的需要来修改相应的数据,具体看write()方法) * Element root = doc.getDocumentElement(); *  * @author echo * @date 2017.3.15 */public class Dom {public static void main(String[] args) throws ParserConfigurationException {//read();//readE();write();}/** * 一层一层判断读取 */public static void read() {// 新建DocumentBuilderFactoryDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();try {DocumentBuilder builder = dbf.newDocumentBuilder();// 获取目标XML文件,输入流InputStream in = Dom.class.getClassLoader().getResourceAsStream("test.xml");// 解析为DocumentDocument doc = builder.parse(in);// 得到根节点Element root = doc.getDocumentElement();// 根节点为空,返回if (root == null) {return;}// 显示根节点System.out.println("root:" + root.getAttribute("name"));// 所有节点NodeList collegeNodes = root.getChildNodes();if (collegeNodes == null) {return;}for (int i = 0; i < collegeNodes.getLength(); i++) {Node college = collegeNodes.item(i);if (college != null&& college.getNodeType() == Node.ELEMENT_NODE) {System.err.println("\t"+ college.getAttributes().getNamedItem("name").getNodeValue());}NodeList classNodes = college.getChildNodes();if (classNodes == null) {return;}for (int j = 0; j < classNodes.getLength(); j++) {Node clazz = classNodes.item(j);if (clazz != null&& clazz.getNodeType() == Node.ELEMENT_NODE) {System.err.println("\t\t"+ clazz.getAttributes().getNamedItem("name").getNodeValue());// 所有学生节点NodeList studentNodes = clazz.getChildNodes();if (studentNodes == null) {continue;}for (int k = 0; k < studentNodes.getLength(); k++) {Node student = studentNodes.item(k);if (student != null&& student.getNodeType() == Node.ELEMENT_NODE) {System.err.print("\t\t\t"+ student.getAttributes().getNamedItem("name").getNodeValue());System.err.print(" "+ student.getAttributes().getNamedItem("sex").getNodeValue());System.err.println(" "+ student.getAttributes().getNamedItem("age").getNodeValue()+ student.getNodeName());}}}}}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** * 调用readNode()方法来获取并显示XML节点 * @throws ParserConfigurationException */public static void readE() throws ParserConfigurationException {// 新建DocumentBuilderFactoryDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder builder = dbf.newDocumentBuilder();InputStream in = Dom.class.getClassLoader().getResourceAsStream("test.xml");Document doc;try {// 解析为Documentdoc = builder.parse(in);// 得到根节点Element root = doc.getDocumentElement();// NodeList nodelist = doc.getElementsByTagName("class");// 获取子节点NodeList nodelist = root.getChildNodes();// 调用readNode()方法读取并显示出子节点readNode(nodelist, "");} catch (SAXException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** * 采用递归方式进行XML的读取 * 是为了简化read()方法中一直用if来判断,如果XML有很多层,不可能全部像read()中的方法进行判断 * @param nodelist NodeList * @param prefix */public static void readNode(NodeList nodelist, String prefix) {// 判断nodelist是否为空if(nodelist == null) {return;}// 循环遍历for(int i = 0; i < nodelist.getLength(); i++) {// 获得第i个节点Node node = nodelist.item(i);// 判断是否是Elementif(node != null && node.getNodeType() == Node.ELEMENT_NODE) {System.out.print(prefix);// 打印出nameSystem.err.print(node.getAttributes().getNamedItem("name").getNodeValue());// 获取node的子节点NodeList list = node.getChildNodes();prefix += "\t";// 递归调用System.out.println();readNode(list, prefix);}}}/** * dom进行XML的写操作 */public static void write() {DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();try {DocumentBuilder builder = dbf.newDocumentBuilder();InputStream in = Dom.class.getClassLoader().getResourceAsStream("test.xml");Document doc = builder.parse(in);Element root = doc.getDocumentElement();if(root == null) {return;}// 修改属性root.setAttribute("name", "dom_change");NodeList collegeNodes = root.getChildNodes();if(collegeNodes != null) {for(int i = 0; i < collegeNodes.getLength() - 1; i++) {// 删除节点Node college = collegeNodes.item(i);if(college.getNodeType() == Node.ELEMENT_NODE) {String collegeName = college.getAttributes().getNamedItem("name").getNodeValue();if("c1".equals(collegeName) || "c2".equals(collegeName)) {root.removeChild(college);} else if("c3".equals(collegeName)) {Element newchild = doc.createElement("class");newchild.setAttribute("name", "c4");college.appendChild(newchild);}}}}// 新增节点Element addCollege = doc.createElement("college");addCollege.setAttribute("name", "c5");root.appendChild(addCollege);Text text = doc.createTextNode("text");addCollege.appendChild(text);// 将修改后的文档保存到文件TransformerFactory transFactory = TransformerFactory.newInstance();Transformer transformer = transFactory.newTransformer();DOMSource domSource = new DOMSource(doc);File file = new File("src/dom_modify.xml");if(file.exists()) {file.delete();}file.createNewFile();FileOutputStream out = new FileOutputStream(file);StreamResult xmlResult = new StreamResult(out);transformer.transform(domSource, xmlResult);System.out.println(file.getAbsolutePath());} catch (Exception e) {e.printStackTrace();}}}
本人水平有限,如有错误,敬请告知!!谢谢啦~~~

0 0
原创粉丝点击