• XML编程总结(二)——使用DOM接口操作xml


    (二)使用DOM接口操作xml

    DOM解析器将整个XML文档加载到内存中,使用DOM模型对XML文档在内存中建模。DOM解析器被称为DocumentBuilder,它位于javax.xml.parsers包下。下面是使用DOM对xml文档进行CRUD操作的演示。

    测试类代码:Source和Result接口的使用,将内存中xml模型输出

      1 public class DomTest {
      2     private Document document;
      3     
      4     @Before
      5     public void setUp() throws Exception{
      6         // 创建工厂对象
      7         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      8         // 创建构建器对象
      9         DocumentBuilder builder = factory.newDocumentBuilder();
     10         // 获取books.xml文档的输入流对象
     11         InputStream is = DomTest.class.getClassLoader().getResourceAsStream("books.xml");
     12         // 解析xml,在内存中构建DOM文档模型
     13         document = builder.parse(is);
     14     }
     15 
     16     
     17     /**
     18      * 查找book的属性为web的title和price节点的文本值
     19      */
     20     @Test
     21     public void testRetrieve() throws Exception{
     22         //获取book节点列表
     23         NodeList nodeList = document.getElementsByTagName("book");
     24         //遍历列表,找到属性为web的book节点
     25         for(int i=0;i<nodeList.getLength();i++){
     26             //将其转换为元素,带有属性,Node类型没有属性
     27             Element element = (Element) nodeList.item(i);
     28             String value = element.getAttribute("category");
     29             //判断属性值为WEB
     30             if("WEB".equals(value)){
     31                 //获取title子节点和price子节点
     32                 Node titleNode=element.getElementsByTagName("title").item(0);
     33                 Node priceNode = element.getElementsByTagName("price").item(0);
     34                 String titleText=titleNode.getTextContent();
     35                 String priceText = priceNode.getTextContent();
     36                 System.out.println("<title>"+titleText+"</title>"+
     37                             "<price>"+priceText+"</price>");
     38             }
     39         }
     40     }
     41     
     42     /**
     43      * 在第一个book元素前增加一个book元素
     44      * <book category="WEB">
     45           <title lang="en">Learning XML</title>
     46           <author>Erik T. Ray</author>
     47           <year>2003</year>
     48           <price>39.95</price>
     49         </book>
     50      * @throws Exception
     51      */
     52     @Test
     53     public void testCreate() throws Exception{
     54         //创建book节点,并创建属性
     55         Element bookElement = document.createElement("book");
     56         Attr attr = document.createAttribute("category");
     57         attr.setTextContent("JAVA");
     58         bookElement.setAttributeNode(attr);
     59         //创建title子节点
     60         Element titleElement=document.createElement("title");
     61         titleElement.setTextContent("Learning JDK8");
     62         //创建author节点
     63         Element authorElement = document.createElement("author");
     64         authorElement.setTextContent("zhang san");
     65         //创建year节点
     66         Element yearElement = document.createElement("year");
     67         yearElement.setTextContent("2013");
     68         //创建price节点
     69         Element priceElement = document.createElement("price");
     70         priceElement.setTextContent("119");
     71         //将这些节点添加到子节点book
     72         bookElement.appendChild(titleElement);
     73         bookElement.appendChild(authorElement);
     74         bookElement.appendChild(yearElement);
     75         bookElement.appendChild(priceElement);
     76         //获得根节点的位置
     77         Node node = document.getElementsByTagName("bookstore").item(0);
     78         //获得要插入引用的节点位置
     79         Node refChild = document.getElementsByTagName("book").item(3);
     80         //refChild=null,表示在最后位置插入
     81         node.insertBefore(bookElement, refChild);
     82         
     83         //打印到控制台
     84         this.transformTo(document);
     85     }
     86     
     87     /**
     88      * 更新下面book节点的price值
     89      * <book category="CHILDREN">
     90           <title lang="en">Harry Potter</title>
     91           <author>J K. Rowling</author>
     92           <year>2005</year>
     93           <price>29.99</price>
     94         </book>
     95      * @throws Exception
     96      */
     97     @Test
     98     public void testUpdate() throws Exception{
     99         //获得该book节点
    100         Element element=(Element) document.getElementsByTagName("book").item(1);
    101         //获得该price节点
    102         Node priceNode = element.getElementsByTagName("price").item(0);
    103         priceNode.setTextContent("49.99");
    104         //获得year节点
    105         Node yearNode=element.getElementsByTagName("year").item(0);
    106         yearNode.setTextContent("2010");
    107         
    108         //打印到控制台
    109         this.transformTo(document);
    110     }
    111     
    112     /**
    113      * 删除category值为WEB的book节点
    114      * @throws Exception
    115      */
    116     @Test
    117     public void testDelete() throws Exception{
    118         //获得父节点
    119         Element parent = (Element) document.getElementsByTagName("bookstore").item(0);
    120         
    121         //获得满足条件的子节点
    122         NodeList nodeList = document.getElementsByTagName("book");
    123         //存储要删除的节点,如果删除一个节点,内存中的DOM会立即变化
    124         List<Node> list=new ArrayList<Node>();
    125         for(int i=0;i<nodeList.getLength();i++){
    126             Element item = (Element) nodeList.item(i);
    127             String attr = item.getAttribute("category");
    128             if("WEB".equals(attr)){
    129                 //保存该节点
    130                 list.add(item);
    131             }
    132         }
    133         //遍历列表
    134         if(list.size()>0){
    135             for(int i=0;i<list.size();i++){
    136                 //删除列表中的节点
    137                 parent.removeChild(list.get(i));
    138             }
    139         }
    140         
    141         //打印到控制台
    142         this.transformTo(document);
    143     }
    144     
    145     /**
    146      * 將DOM模型输出到控制台
    147      * @param node
    148      * @throws Exception
    149      */
    150     private void  transformTo(Node node) throws Exception{
    151         // 构造转换器
    152         TransformerFactory tf = TransformerFactory.newInstance();
    153         Transformer transformer = tf.newTransformer();
    154         // 指定源
    155         Source xmlSource = new DOMSource(node);
    156         // 指定目标
    157         // OutputStream os=new FileOutputStream("books_new.xml");
    158         Result outputTarget = new StreamResult(System.out);
    159         transformer.transform(xmlSource, outputTarget);
    160     }
    161 }
  • 相关阅读:
    .NET程序员 湖南创世纪网络
    java.lang.NoSuchMethodError:SpringJAR包版本冲突错误解决方法
    事实表和纬度表概述
    SQL Server中char、nchar、varchar、nvarchar的区别
    biztalk 2010 映射
    biztalk 2010 架构
    字符编码简单总结
    浅析组织结构与个人发展的关系
    缓慢渐变维度的处理方式
    SQL server中SET ANSI_PADDING对char、varchar、nvarchar的影响
  • 原文地址:https://www.cnblogs.com/techlogy/p/5964960.html
Copyright © 2020-2023  润新知