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
- XML DOM---解析xml dom
- 【XML】DOM解析XML
- 解析xml dom 解析
- xml解析 Dom解析
- dom解析xml
- dom解析 xml
- dom解析xml
- 解析xml之--DOM
- Dom解析XML文档
- DOM解析XML文件
- dom解析xml
- dom解析xml
- xml文件解析-DOM
- JAVA解析XML DOM
- DOM解析XML
- JAVA解析XML DOM
- XML DOM解析
- JAVA解析XML DOM
- lunix文件查找的小总结
- 欢迎使用CSDN-markdown编辑器
- Memcached 与Redis缓存服务器介绍
- Java学习--day3
- ssh 工具 secureCRT
- XML解析-----DOM
- pom.xml中maven-compiler-plugin插件配置的使用
- 内联函数
- My Project
- GitHub上制作自己的Library,直接compile使用
- Eclipse自动提示+自动补全自定义按键
- 二叉树的前序、中序、后序、层次遍历的递归与非递归实现
- Android 自定义View基础(五)--DragView
- success1