使用JAXP对XML文档进行DOM解析

前端之家收集整理的这篇文章主要介绍了使用JAXP对XML文档进行DOM解析前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

XML解析方式分为两种:dom和sax

dom:(Document Object Model,即文档对象模型)是W3C组织推荐的解析XML的一种方式。

sax:(Simple API for XML)不是官方标准,但它是XML社区事实上的标准,几乎所有的XML解析器都支持它。


dom和sax解析方法的区别:

1.dom解析的优点:对文档CRUD比较方便;缺点:占用内存比较大

2.sax解析的优点:占用内存少,解析速度快;取点:只适合做文档读取,不适合做文档的CRUD


XML解析开发包:Jaxp(sun)、Jdom、dom4j


使用JAXP对XML文档进行DOM解析

核心代码

  1. //1,创建工厂
  2. DocumentBuilderFactory factor=DocumentBuilderFactory.newInstance();
  3. //2,得到dom解析器
  4. DocumentBuilder builder=factor.newDocumentBuilder();
  5. //3,解析xml文档,得到代表文档的document
  6. builder.parse("src/book.xml");

增,删,改 需要将更新后的内容在写到xml中
  1. TransformerFactory tffactory=TransformerFactory.newInstance();
  2. Transformer tf=tffactory.newTransformer();
  3. tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));


下面是一些基本练习,比较基础简单,需 用JUnit Test运行

book.xml

  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. <书架>
  3. <span style="white-space:pre"> </span><书>
  4. <span style="white-space:pre"> </span><书名 name="XXXX">Java基础</书名>
  5. <span style="white-space:pre"> </span><进价>40元</进价>
  6. <span style="white-space:pre"> </span><零售价>159元</零售价>
  7. <span style="white-space:pre"> </span>
  8. <span style="white-space:pre"> </span></书>
  9. <span style="white-space:pre"> </span><书>
  10. <span style="white-space:pre"> </span><书名>Java从入门到精通</书名>
  11. <span style="white-space:pre"> </span><进价>90元</进价>
  12. <span style="white-space:pre"> </span><零售价>30元</零售价>
  13. <span style="white-space:pre"> </span></书>
  14. </书架>

Demo.java

  1. package com.yong.xml;
  2.  
  3. import java.io.FileOutputStream;
  4.  
  5. import javax.xml.parsers.DocumentBuilder;
  6. import javax.xml.parsers.DocumentBuilderFactory;
  7. import javax.xml.transform.Transformer;
  8. import javax.xml.transform.TransformerFactory;
  9. import javax.xml.transform.dom.DOMSource;
  10. import javax.xml.transform.stream.StreamResult;
  11.  
  12. import org.junit.Test;
  13. import org.w3c.dom.Document;
  14. import org.w3c.dom.Element;
  15. import org.w3c.dom.Node;
  16. import org.w3c.dom.NodeList;
  17.  
  18. //使用dom方式对xml文档进行crud
  19. public class Demo2 {
  20.  
  21. @Test
  22. //读取book.xml文档中:<书名>Java从入门到精通</书名> 节点中的值
  23. public void read1() throws Exception
  24. {
  25. DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
  26. DocumentBuilder builder=factory.newDocumentBuilder();
  27. Document document=builder.parse("src/book.xml");
  28. NodeList list =document.getElementsByTagName("书名");
  29. //dom解析下,xml文档的每一个组成部分都会用一个对象表示,不管什么对象,
  30. //都是Node的子类,所以在开发中科院把获取到的任意节点都当做Node对待
  31. Node node=list.item(1);
  32. String content=node.getTextContent();
  33. System.out.println(content); //打印结果:Java从入门到精通
  34. }
  35. @Test
  36. //得到book.xml文档中的所有标签
  37. public void read2() throws Exception
  38. {
  39. DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
  40. DocumentBuilder builder=factory.newDocumentBuilder();
  41. Document document=builder.parse("src/book.xml");
  42. //得到根节点
  43. Node root=document.getElementsByTagName("书架").item(0);
  44. list(root);
  45. }
  46. private void list(Node node) {
  47. if(node instanceof Element)
  48. {
  49. System.out.println(node.getNodeName());
  50. }
  51. NodeList list=node.getChildNodes();
  52. for(int i=0;i<list.getLength();i++)
  53. {
  54. Node child=list.item(i);
  55. list(child);// 打印出各个标签:书架 书 书名 进价 零售价 书 书名 进价 零售价
  56. }
  57. }
  58. @Test
  59. //得到book.xml中标签内的属性值 <书名 name="XXXX">Java基础</书名>
  60. public void read3() throws Exception
  61. {
  62. DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
  63. DocumentBuilder builder=factory.newDocumentBuilder();
  64. Document document=builder.parse("src/book.xml");
  65. Element bookname=(Element) document.getElementsByTagName("书名").item(0);
  66. String value=bookname.getAttribute("name");
  67. System.out.println(value); //打印结果:XXXX
  68. }
  69. @Test
  70. //向book.xml中添加 <团购>12元</团购>
  71. public void add() throws Exception
  72. {
  73. DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
  74. DocumentBuilder builder=factory.newDocumentBuilder();
  75. Document document=builder.parse("src/book.xml");
  76. //创建节点
  77. Element price=document.createElement("团购");
  78. price.setTextContent("12元");
  79. //把创建的节点挂到第一本书上
  80. Element book=(Element) document.getElementsByTagName("书").item(0);
  81. book.appendChild(price);
  82. //把更新后内存写回到xml文档
  83. TransformerFactory tffactory=TransformerFactory.newInstance();
  84. Transformer tf=tffactory.newTransformer();
  85. tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));
  86. }
  87. @Test
  88. //向book.xml中指定位置上添加节点
  89. public void add2() throws Exception
  90. {
  91. DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
  92. DocumentBuilder builder=factory.newDocumentBuilder();
  93. Document document=builder.parse("src/book.xml");
  94. //创建节点
  95. Element price=document.createElement("批发");
  96. price.setTextContent("8元");
  97. //得到参考点
  98. Element refNode=(Element) document.getElementsByTagName("零售价").item(0);
  99. //得到要挂崽的节点
  100. Element book=(Element) document.getElementsByTagName("书").item(0);
  101. //往book节点的指定位置插崽
  102. book.insertBefore(price,refNode);
  103. //把更新后内存写回到xml文档
  104. TransformerFactory tffactory=TransformerFactory.newInstance();
  105. Transformer tf=tffactory.newTransformer();
  106. tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));
  107. }
  108. @Test
  109. //向book.xml文档节点上添加属性, <书名 >Java基础</书名>上添加 name="XXXX"属性
  110. public void addAttr() throws Exception
  111. {
  112. DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
  113. DocumentBuilder builder=factory.newDocumentBuilder();
  114. Document document=builder.parse("src/book.xml");
  115. Element bookname=(Element) document.getElementsByTagName("书名").item(0);
  116. bookname.setAttribute("name","XXXX");
  117. //把更新后内存写回到xml文档
  118. TransformerFactory tffactory=TransformerFactory.newInstance();
  119. Transformer tf=tffactory.newTransformer();
  120. tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));
  121. }
  122. @Test
  123. //删除book.xml中的指定节点方法
  124. public void delete1() throws Exception
  125. {
  126. DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
  127. DocumentBuilder builder=factory.newDocumentBuilder();
  128. Document document=builder.parse("src/book.xml");
  129. //得到要删除的节点
  130. Element e=(Element) document.getElementsByTagName("售价").item(0);
  131. //得到要删除的节点的爸爸
  132. Element book=(Element) document.getElementsByTagName("书").item(0);
  133. //爸爸删崽
  134. book.removeChild(e);
  135. //把更新后内存写回到xml文档
  136. TransformerFactory tffactory=TransformerFactory.newInstance();
  137. Transformer tf=tffactory.newTransformer();
  138. tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));
  139. }
  140. @Test
  141. //删除book.xml中的指定节点方法
  142. public void delete2() throws Exception
  143. {
  144. DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
  145. DocumentBuilder builder=factory.newDocumentBuilder();
  146. Document document=builder.parse("src/book.xml");
  147. //得到要删除的节点
  148. Element e=(Element) document.getElementsByTagName("售价").item(0);
  149. e.getParentNode().removeChild(e);
  150. //把更新后内存写回到xml文档
  151. TransformerFactory tffactory=TransformerFactory.newInstance();
  152. Transformer tf=tffactory.newTransformer();
  153. tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));
  154. }
  155. @Test
  156. //更改book.xml中节点的属性
  157. public void update() throws Exception
  158. {
  159. DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
  160. DocumentBuilder builder=factory.newDocumentBuilder();
  161. Document document=builder.parse("src/book.xml");
  162. //得到要修改的节点
  163. Element e=(Element) document.getElementsByTagName("售价").item(0);
  164. e.setTextContent("2201元");
  165. //把更新后内存写回到xml文档
  166. TransformerFactory tffactory=TransformerFactory.newInstance();
  167. Transformer tf=tffactory.newTransformer();
  168. tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));
  169. }
  170. }

猜你在找的XML相关文章