XML解析-----DOM

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

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() {
		// 新建DocumentBuilderFactory
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		try {
			DocumentBuilder builder = dbf.newDocumentBuilder();
			// 获取目标XML文件,输入流
			InputStream in = Dom.class.getClassLoader().getResourceAsStream(
					"test.xml");
			// 解析为Document
			Document 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 block
			e.printStackTrace();
		}
	}

	/**
	 * 调用readNode()方法来获取并显示XML节点
	 * @throws ParserConfigurationException
	 */
	public static void readE() throws ParserConfigurationException {
		// 新建DocumentBuilderFactory
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = dbf.newDocumentBuilder();
		InputStream in = Dom.class.getClassLoader().getResourceAsStream("test.xml");
		Document doc;
		try {
			// 解析为Document
			doc = 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 block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.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);
			// 判断是否是Element
			if(node != null && node.getNodeType() == Node.ELEMENT_NODE) {
				System.out.print(prefix);
				// 打印出name
				System.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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值