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 }
时间: 2024-08-24 07:39:33

XML编程总结(二)——使用DOM接口操作xml的相关文章

XML编程总结(五)——使用StAX接口操作xml

(五)使用StAX接口操作xml StAX,全称Streaming API for XML,一种全新的,基于流的JAVA XML解析标准类库.其最终版本于 2004 年 3 月发布,并成为了 JAXP 1.4(将包含在即将发布的 Java 6 中)的一部分.在某种程度上来说,StAX与SAX一样是基于XML事件的解析方式,它们都不会一次性加载整个XML文件.但是它们之间也有很大的不同. StAX和SAX的区别——拉式解析器和推式解析器的区别 虽然StAX与SAX一样基于XML事件解析,相比于DO

XML编程总结(三)——使用SAX接口操作xml

(三)使用SAX接口操作xml SAX解析器被称为SAXParser,SAXParser是由javax.xml.parsers.SAXParserFactory创建的.与DOM解析器不同,SAX解析器并不创建XML文档的内存表示,因此会占用更少的内存.SAX解析器通过调用回调方法(事件驱动)将XML文档结构通知客户端,也就是通过调用提供给SAXParser的org.xml.sax.helpers.DefaultHandler处理器内的方法. org.xml.sax.helpers.Default

QT开发(四十二)——DOM方式解析XML

QT开发(四十二)--DOM方式解析XML 一.DOM简介 1.DOM简介 DOM是Document Object Model的简写,即XML文档对象模型,是由W3C提出的一种处理XML文档的标准接口. DOM 一次性读入整个XML文档,在内存中构造为一棵树(DOM树)将XML文件表示成一棵树,便于随机访问其中的节点,但消耗内存相对多一些.能够在这棵树上进行导航,比如移动到下一节点或者返回上一节点,也可以对这棵树进行修改,或者是直接将这颗树保存为硬盘上的一个 XML 文件. 2.XML DOM节

PHP原生DOM对象操作XML&#39;代码&#39;

对于操作XML类型文件,PHP内置有一套DOM对象可以进行处理.对XML的操作,从创建.添加到修改.删除都可以使用DOM对象中的函数来进行. 创建 创建一个新的XML文件,并且写入一些数据到这个XML文件中. /* * 创建xml文件 */ $info = array( array('obj' => 'power','info' => 'power is shutdown'), array('obj' => 'memcache','info' => 'memcache used t

PHP 原生 DOM 对象操作 XML

对于操作XML类型文件,PHP语言内置有一套DOM对象可以进行处理.对XML的操作,从创建.添加到修改.删除都可以使用DOM对象中的函数来进行. 创建 创建一个新的XML文件,并且写入一些数据到这个XML文件中. /* * 创建xml文件 */ $info = array( array('obj' => 'power','info' => 'power is shutdown'), array('obj' => 'memcache','info' => 'memcache used

xerces-c用DOM方式操作xml

xerces-c是一个可以校验XML合法性的XML解析器,它的语言是C++,它的官方主页:http://xml.apache.org/xerces-c.它支持下面这些标准:XML 1.0 ,XML 1.1 ,DOM 1, 2, 3 , SAX 1.0 和SAX 2.0, XML Schema. xerces操作XML主要是分几步: 先调用XMLPlatformUtils::Initialize初始化环境,其中最重要是初始化内存管理器.如果没有调用这个,直接进行下面的步骤,程序会崩溃. 使用Xer

XML编程总结(一)——目录

本系列文章对Java领域中常用的几种操作XML的编程方式进行归纳,归纳的知识属于基础范畴,概括的不全面.主要通过实例操作方法进行演示,原理部分的讲解甚少,如需请查阅详细文档资料.本文分为以下几个部分: (一)JAXP简介 (二)使用DOM接口操作xml (三)使用SAX接口操作xml (四)使用dom4j方式操作xml (五)使用StAX接口操作xml (六)使用JAXB进行java对象和xml格式之间的相互转换 (七)使用XPath对象查询xml文档 (一)JAXP简介 JAXP(Java A

XML简明教程——文档对象模型——DOM和SAX(二)

DOM概述: DOM是一种典型的基于XML文档树状结构的解析技术.从概念上看,DOM的解析方式非常容易理解.DOM首先加载XML文档,并把XML树状结构存放到计算机内存中做进一步处理. 1.DOM与XML基于树状结构的解析模式 1.1XML基于树状结构的解析模式 XML文档中的文档类型描述.元素.属性.处理指令.注释和文本内容都可以视为状态树的节点.虽然从XML文档本身和XPath的角度来看,节点的含义略有不同,但是,一个XML文档能够被看作是按照一定层次结构分布的节点树. 当一个XML文档被以

flex 操作xml 实现增删改查 .

一 在介绍Flex中操作XML之前,首先简单介绍下XML中的基本术语. 元素:XML中拥有开始标签和结束标签的这一块称为“元素”    节点:把XML元素与文本结合起来统称为节点    根节点:位于整个XML文当顶端的节点    文本节点:包含文本的节点    属性:元素的组成部分,以键/值形式放在元素标签内 用一个例子来说明 view plaincopy to clipboardprint?<root_node><!--这是一个根节点也是一个元素-->            &l