首页 > 代码库 > XML编程总结(二)——使用DOM接口操作xml
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 = http://www.mamicode.com/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 Exception115 */116 @Test117 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 node148 * @throws Exception149 */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 }
XML编程总结(二)——使用DOM接口操作xml
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。