XML 的 DOM 解析范例:将XML用作数据库

前端之家收集整理的这篇文章主要介绍了XML 的 DOM 解析范例:将XML用作数据库前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
1,建立 domain 类

Student.java

  1. public class Student {
  2. public Student() {
  3. super();
  4. }
  5.  
  6. public Student(String number,String name,String age,String sex) {
  7. super();
  8. this.number = number;
  9. this.name = name;
  10. this.age = age;
  11. this.sex = sex;
  12. }
  13.  
  14. @Override
  15. public String toString() {
  16. return "Student [number=" + number + ",name=" + name + ",age=" + age
  17. + ",sex=" + sex + "]";
  18. }
  19.  
  20. public String getNumber() {
  21. return number;
  22. }
  23.  
  24. public void setNumber(String number) {
  25. this.number = number;
  26. }
  27.  
  28. public String getName() {
  29. return name;
  30. }
  31.  
  32. public void setName(String name) {
  33. this.name = name;
  34. }
  35.  
  36. public String getAge() {
  37. return age;
  38. }
  39.  
  40. public void setAge(String age) {
  41. this.age = age;
  42. }
  43.  
  44. public String getSex() {
  45. return sex;
  46. }
  47.  
  48. public void setSex(String sex) {
  49. this.sex = sex;
  50. }
  51.  
  52. private String number;
  53. private String name;
  54. private String age;
  55. private String sex;
  56. }
2,因为要将数据存储保存到XML文件中,而解析XML文件,或者将内存中的数据写入XML 文件都需要一些固定的解析格式,这时需要一个工具类,这就是简单的DomUtils.java

  1. import javax.xml.parsers.DocumentBuilder;
  2. import javax.xml.parsers.DocumentBuilderFactory;
  3. import javax.xml.transform.OutputKeys;
  4. import javax.xml.transform.Result;
  5. import javax.xml.transform.Source;
  6. import javax.xml.transform.Transformer;
  7. import javax.xml.transform.TransformerFactory;
  8. import javax.xml.transform.dom.DOMSource;
  9. import javax.xml.transform.stream.StreamResult;
  10.  
  11. import org.w3c.dom.Document;
  12.  
  13. public class DomUtils {
  14. /**
  15. * JAXP保存Document
  16. * @param doc
  17. * @param xmlName
  18. */
  19. public static void saveDocument(Document doc,String xmlName){
  20. TransformerFactory factory = TransformerFactory.newInstance();
  21. try {
  22. Transformer transform = factory.newTransformer();
  23. //设置保存格式
  24. /**
  25. * public abstract void setOutputProperty(String name,String value)
  26. throws IllegalArgumentException设置转换中实际的输出属性
  27. 以两部分字符串形式传递限定属性名称,即用花括号括起来的名称空间 URI,后跟本地名称。如果名称中有 null URL,则 String 只包含本地名称。应用程序可以通过测试安全地检查非 null URI,以查看名称的首字符是否为 '{' 字符。
  28. 例如,如果 URI 和本地名称是从通过 <xyz:foo xmlns:xyz="http://xyz.foo.com/yada/baz.html"/> 定义的元素获取的,则限定名称将为 "{http://xyz.foo.com/yada/baz.html}foo"。注意,不使用前缀。
  29. 传递给 setOutputProperties(java.util.Properties) 的 Properties 对象不会受到调用方法的影响。
  30.  
  31. 参数:
  32. name - 指定了输出属性名称的非 null String,它可以是名称空间限定的。
  33. value - 输出属性的非 null 字符串值。
  34. 抛出:
  35. IllegalArgumentException - 如果不支持属性,且该属性没有限定于某一名称空间。
  36. 另请参见:
  37. OutputKeys
  38. INDENT
  39. indent = "yes" | "no". indent 指定了当输出结果树时,Transformer 是否可以添加额外的空白;其值必须为 yes 或 no。
  40. */
  41. transform.setOutputProperty(OutputKeys.INDENT,"yes");
  42. //Source实现此接口的对象包含充当源输入(XML 源或转换指令)所需的信息
  43. Source source = new DOMSource(doc);
  44. //Result实现此接口的对象包含构建转换结果树所需的信息。
  45. Result outputTarget = new StreamResult(xmlName);
  46. transform.transform(source,outputTarget);
  47. } catch (Exception e) {
  48. throw new RuntimeException(e);
  49. }
  50. }
  51. /**
  52. * 获取Document对象
  53. * @param xmlName
  54. */
  55. public static Document getDocument(String xmlName){
  56. DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
  57. Document doc = null ;
  58. try {
  59. DocumentBuilder builder = builderFactory.newDocumentBuilder();
  60. doc = builder.parse(xmlName);
  61. } catch (Exception e) {
  62. throw new RuntimeException();
  63. }
  64. return doc;
  65. }
  66. /**
  67. * 创建Document对象
  68. * @return
  69. */
  70. public static Document newDocument(){
  71. DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
  72. DocumentBuilder builder = null;
  73. try {
  74. builder = builderFactory.newDocumentBuilder();
  75. Document doc = builder.newDocument();
  76. doc.setXmlVersion("1.0");
  77. doc.setXmlStandalone(true);
  78. return doc;
  79. } catch (Exception e) {
  80. throw new RuntimeException();
  81. }
  82. }
  83. }


3,如下是具体的dom规范解析xml过程

  1. import java.util.LinkedList;
  2. import java.util.List;
  3.  
  4. import org.junit.Test;
  5. import org.w3c.dom.Document;
  6. import org.w3c.dom.Element;
  7. import org.w3c.dom.NodeList;
  8.  
  9. public class DomaAalyzeXml {
  10. /**
  11. * 遍历Students.xml
  12. */
  13. @Test
  14. public void traversalStudentXmlTest() {
  15. // 获取Document对象
  16. Document doc = DomUtils.getDocument("src/students.xml");
  17. // 获取根元素
  18. Element root = doc.getDocumentElement();
  19. NodeList list = root.getElementsByTagName("student");
  20. for (int i = 0; i < list.getLength(); i++) {
  21. // Node node = list.item(i);
  22. // Element element = (Element) node;
  23. Element ele = (Element) list.item(i);
  24. //打印
  25. printElement(ele);
  26. }
  27. // 获取所有
  28. // NodeList list = root.getChildNodes();
  29. // /**
  30. // * int getLength() 列表中的节点数。
  31. // * Node item(int index) 返回集合中的第 index 个项。
  32. // */
  33. // for (int i = 0; i < list.getLength(); i++) {
  34. // Node node = list.item(i);
  35. // if (node.getNodeType() == node.ELEMENT_NODE) {
  36. // System.out.println(node.getNodeName() + ","
  37. // + node.getNodeValue());
  38. // }
  39. // }
  40. }
  41. /**
  42. * 给name为lisi元素添加<score>子元素
  43. */
  44. @Test public void addChildNodeTest(){
  45. Document doc = DomUtils.getDocument("src/students.xml");
  46. Element root = doc.getDocumentElement();
  47. NodeList list = root.getElementsByTagName("student");
  48. for (int i = 0; i < list.getLength(); i++) {
  49. Element ele = (Element)list.item(i);
  50. String name = ele.getElementsByTagName("name").item(0).getTextContent();
  51. if(name.equals("lisi")){
  52. /**
  53. * 1,创建<score>
  54. * 2,给它添加文本元素
  55. * 3,将<score>添加到ele中
  56. * /
  57. Element scoreEle = doc.createElement("score");
  58. scoreEle.setTextContent("59.5");
  59. ele.appendChild(scoreEle);
  60. break;
  61. }
  62. }
  63. DomUtils.saveDocument(doc,"src/addChildNode.xml");
  64. }
  65.  
  66. /**
  67. * 为张三添加friend属性,指定为李四学号
  68. * @param ele
  69. */
  70. @Test public void addAttributeTest(){
  71. Document doc = DomUtils.getDocument("src/students.xml");
  72. NodeList list = doc.getDocumentElement().getElementsByTagName("student");
  73. Element ls = null;
  74. Element zs = null;
  75. for (int i = 0; i < list.getLength(); i++) {
  76. Element ele = (Element)list.item(i);
  77. String name = ele.getElementsByTagName("name").item(0).getTextContent();
  78. if("zhangsan".equals(name)){
  79. zs = ele;
  80. }else if ("lisi".equals(name)) {
  81. ls = ele;
  82. }
  83. if(ls != null && zs != null){
  84. break;
  85. }
  86. }
  87. if(ls == null || zs == null){
  88. return;
  89. }
  90. //获取lisi的number属性
  91. String number = ls.getAttribute("number");
  92. //创建<friend>
  93. zs.setAttribute("friend",number);
  94. //保存
  95. DomUtils.saveDocument(doc,"src/addAttribute.xml");
  96. }
  97. /**
  98. * 删除number为ID_1003的学生元素
  99. */
  100. @Test public void deleteElementTest(){
  101. Document doc = DomUtils.getDocument("src/students.xml");
  102. Element root = doc.getDocumentElement();
  103. NodeList list = root.getElementsByTagName("student");
  104. for(int i = 0 ; i < list.getLength();i++){
  105. Element ele = (Element)list.item(i);
  106. String number = ele.getAttribute("number");
  107. if("N_1003".equals(number)){
  108. //获取其父节点,再通过父节点来删除当前节点
  109. ele.getParentNode().removeChild(ele);
  110. }
  111. }
  112. //保存
  113. DomUtils.saveDocument(doc,"src/deleteNode.xml");
  114. }
  115. /**
  116. * 通过List<Student>生成Document并保存
  117. */
  118. @Test public void testList2Document(){
  119. //得到Student的集合对象
  120. List<Student> stuList = getList();
  121. //创建Document
  122. Document doc = DomUtils.newDocument();
  123. //给当前文档添加根元素
  124. Element root = doc.createElement("students");
  125. //为root元素添加子元素及其属性
  126. /**
  127. * 1,遍历Student集合对象,得到Student对象
  128. * 2,将Student转换为Element
  129. * 3,将元素添加到root中
  130. */
  131. for (Student student : stuList) {
  132. Element ele = toElement(doc,student);
  133. root.appendChild(ele);
  134. }
  135. //将根元素添加到当前文档中
  136. doc.appendChild(root);
  137. DomUtils.saveDocument(doc,"src/student.xml");
  138. }
  139.  
  140. /**
  141. * 将Student转换为Element
  142. * @param doc
  143. * @param student
  144. * @return
  145. */
  146. private Element toElement(Document doc,Student stu) {
  147. Element student_tag = doc.createElement("student");//学生节点
  148. Element name = doc.createElement("name");
  149. Element age = doc.createElement("age");
  150. Element sex = doc.createElement("sex");
  151. // 对Element各个属性赋值
  152. student_tag.setAttribute("number",stu.getNumber());
  153. name.setTextContent(stu.getName());
  154. age.setTextContent(stu.getAge());
  155. sex.setTextContent(stu.getSex());
  156. // 将各个属性添加到 student 对象
  157. student_tag.appendChild(name);
  158. student_tag.appendChild(age);
  159. student_tag.appendChild(sex);
  160. return student_tag;
  161. }
  162. private List<Student> getList() {
  163. List<Student> list = new LinkedList<Student>();
  164. list.add(new Student("N_001","zhangSan","20","male"));
  165. list.add(new Student("N_002","liSi","21","female"));
  166. list.add(new Student("N_003","wangWu","22","male"));
  167. list.add(new Student("N_004","zhaoLiu","23","female"));
  168. list.add(new Student("N_005","chenQi","24","male"));
  169. return list;
  170. }
  171. private void printElement(Element ele) {
  172. String number = ele.getAttribute("number");
  173. String name = ele.getElementsByTagName("name").item(0).getTextContent();
  174. String age = ele.getElementsByTagName("age").item(0).getTextContent();
  175. String sex = ele.getElementsByTagName("sex").item(0).getTextContent();
  176. System.out.println(number + "--" + name + "-" + age + "-" + sex);
  177. }
  178. }


4,下面是testList2Document()方法运行结果:

  1. <?xml version="1.0" encoding="UTF-8"?><students>
  2. <student number="N_001">
  3. <name>zhangSan</name>
  4. <age>20</age>
  5. <sex>male</sex>
  6. </student>
  7. <student number="N_002">
  8. <name>liSi</name>
  9. <age>21</age>
  10. <sex>female</sex>
  11. </student>
  12. <student number="N_003">
  13. <name>wangWu</name>
  14. <age>22</age>
  15. <sex>male</sex>
  16. </student>
  17. <student number="N_004">
  18. <name>zhaoLiu</name>
  19. <age>23</age>
  20. <sex>female</sex>
  21. </student>
  22. <student number="N_005">
  23. <name>chenQi</name>
  24. <age>24</age>
  25. <sex>male</sex>
  26. </student>
  27. </students>



这里用的工具类只是简单的处理了,如果需要查看更加详细的dom4j的工具类方法,读者可以参考 Do4j,希望朋友多提宝贵意见。

猜你在找的XML相关文章