使用dom对xml的增删改查

17 篇文章 0 订阅
3 篇文章 0 订阅

转自:http://blog.csdn.net/yezis/article/details/21230951

DOM是W3C组织推广的一中操作xml文件的方法,也是java原生态操作xml文件的方法之一,DOM的优点就是操作xml文件简单,可以重复随便的增删改查,但是不足的是,在操作前需要把整个xml文件以树状图加载到内存中,这样的话会影响程序的运行效率,所以,小的xml文件用DOM才是不错的选择

被操作的xml文件如下:

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <clazz>  
  3.     <student sn="01">  
  4.         <name>张三</name>  
  5.         <age>18</age>  
  6.     </student>  
  7.     <student sn="02">  
  8.         <name>李四</name>  
  9.         <age>20</age>  
  10.     </student>  
  11.     <student sn="03">  
  12.         <name>王五</name>  
  13.         <age>20</age>  
  14.     </student>  
  15. </clazz>  


xml文件与项目的路径关系如下:


问题:
【节点的增、删、改、查】
1、在根节点下增加一个<student>节点,添加属性sn值为04,<student>节点下有<name>、<age>节点节点内容分别为name=赵六,age=21(节点的增加)
2、在根节点下找到属性sn为02的<student>节点,并输出该节点下的姓名,年龄(节点的查询)
3、在根节点下找到属性sn为03的<student>节点,并删除该节点(节点的删除)
4、在根节点下找到属性sn为01的<student>节点,并把<student>节点修改为<teacher>(节点的修改)
【节点属性的增、删、改、查】
1、在sn=01的节点上增加属性type=班长
2、删除sn=02的sn属性
3、修改sn=03的sn属性为05
4、查询......(上面的都用到了)
【节点内容的增、删、改、查】
(其中的增与删没必要,因为增加就是改,删除也是改,删除也可以直接删除节点,所以只有改和查有意义)
1、查询sn=01的同学姓名
2、修改sn=02的同学姓名为王二


1、获取Document对象:

Document就是xml文件的“树状图”,获取Document对象需要通过工厂类去获取,下面的方法会返回一个Document对像,

[java]  view plain  copy
  1. public Document createDocument(){  
  2.           
  3.     Document document = null;  
  4.           
  5.     try {  
  6.         DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();  
  7.         FileInputStream  xmlInputStream = new FileInputStream("xmlFile/clazzXml.xml");  
  8.         DocumentBuilder builder = builderFactory.newDocumentBuilder();  
  9.               
  10.         document = builder.parse(xmlInputStream);  
  11.               
  12.     } catch (ParserConfigurationException e) {  
  13.         // TODO Auto-generated catch block  
  14.         e.printStackTrace();  
  15.     } catch (FileNotFoundException e) {  
  16.         // TODO Auto-generated catch block  
  17.         e.printStackTrace();  
  18.     } catch (SAXException e) {  
  19.         // TODO Auto-generated catch block  
  20.         e.printStackTrace();  
  21.     } catch (IOException e) {  
  22.         // TODO Auto-generated catch block  
  23.         e.printStackTrace();  
  24.     }  
  25.           
  26.     return document;  
  27.           
  28. }  

2、获取根节点:

获取xml的根节点可以通过Document中的getDocumentElement()方法:

[java]  view plain  copy
  1. Element root = document.getDocumentElement();  

3、遍历xml文件:

[java]  view plain  copy
  1. public void domXML(Document document){  
  2.           
  3.     Element root = document.getDocumentElement();  
  4.     System.out.println("xml文件的根节点为:"+root.getNodeName());  
  5.     System.out.println();  
  6.     NodeList stuNodeList = root.getChildNodes();  
  7.           
  8.     for(int i = 0;i < stuNodeList.getLength();i ++){  
  9.               
  10.         Node stuInforNode = stuNodeList.item(i);  
  11.         if(stuInforNode.getNodeType() == Node.ELEMENT_NODE){  
  12.                   
  13.             NodeList stuNode = stuInforNode.getChildNodes();  
  14.             for(int j = 0;j < stuNode.getLength();j ++){  
  15.                       
  16.                 Node stuNode2 = stuNode.item(j);  
  17.                 if(stuNode2.getNodeName().equals("name")){  
  18.                     System.out.println("姓名:"+stuNode2.getTextContent());  
  19.                 }  
  20.                 else if(stuNode2.getNodeName().equals("age")){  
  21.                     System.out.println("年龄:"+stuNode2.getTextContent());  
  22.                 }  
  23.                   
  24.             }  
  25.                   
  26.         }  
  27.               
  28.     }  
  29.           
  30. }  


4、为指定节点下添加子节点:

[java]  view plain  copy
  1. //  1、在根节点下增加一个<student>节点,添加属性sn值为04,  
  2. //  <student>节点下有<name>、<age>节点节点内容分别为name=赵六,age=21(节点的增加)  
  3.     public void addElement(Document document){  
  4.           
  5.         Element root = document.getDocumentElement();  
  6.           
  7.         //解决问题步骤1、创建节点 创建属性 创建内容 2、写入内容 写入属性 写入节点  
  8.         //1、创建  
  9.         //创建students节点以及students下的name节点与age节点  
  10.         Element stuEle = document.createElement("student");  
  11.         Element nameEle = document.createElement("name");  
  12.         Element ageEle = document.createElement("age");  
  13.         //创建name与age内容  
  14.         Text nameText = document.createTextNode("赵六");  
  15.         Text ageText = document.createTextNode("21");  
  16.         //创建student节点属性sn=04  
  17.         Attr stuAttr = document.createAttribute("sn");  
  18.         stuAttr.setValue("04");  
  19.           
  20.         //2、写入  
  21.         //写入属性  
  22.         stuEle.setAttributeNode(stuAttr);  
  23.         //把name、age写入student下  
  24.         stuEle.appendChild(nameEle);  
  25.         stuEle.appendChild(ageEle);  
  26.         //写入内容  
  27.         nameEle.appendChild(nameText);  
  28.         ageEle.appendChild(ageText);  
  29.         //把student写入根节点下  
  30.         root.appendChild(stuEle);  
  31.           
  32.           
  33.     }  

该方法可以增加xml文件的节点 但是 程序执行后 打开xml文件 xml并没有改变 这好似因为我们并没有把修改过的xml重新写入到文件中 重新写入xml要使用Transformer对象

5、Transformer对象的获取 与保存修改过的xml文件

[java]  view plain  copy
  1. //保存xml文件  
  2.     public void saveXml(Document document){  
  3.           
  4.         TransformerFactory transformerFactory = TransformerFactory.newInstance();  
  5.         try {  
  6.             Transformer transformer = transformerFactory.newTransformer();  
  7.             DOMSource domSource = new DOMSource(document);  
  8.             StreamResult streamResult = new StreamResult(new FileOutputStream("xmlFile/clazzXml.xml"));  
  9.               
  10.             transformer.transform(domSource, streamResult);  
  11.               
  12.         } catch (TransformerConfigurationException e) {  
  13.             // TODO Auto-generated catch block  
  14.             e.printStackTrace();  
  15.         } catch (FileNotFoundException e) {  
  16.             // TODO Auto-generated catch block  
  17.             e.printStackTrace();  
  18.         } catch (TransformerException e) {  
  19.             // TODO Auto-generated catch block  
  20.             e.printStackTrace();  
  21.         }  
  22.           
  23.     }  

这样,加入修改过的Document对象 就会把修改过的xml文件保存


关于文章开头问题中剩下的操作请点击下面的连接下载源码

http://download.csdn.net/detail/yezis/7039201

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值