一、概述

  XML全称为可扩展的标记语言。主要用于描述数据和用作配置文件。

  XML文档在逻辑上主要由一下5个部分组成:

  • XML声明:指明所用XML的版本、文档的编码、文档的独立性信息
  • 文档类型声明:指出XML文档所用的DTD
  • 元素:由开始标签、元素内容和结束标签构成
  • 注释:以<!--开始,以-->结束,用于对文档中的内容起一个说明作用
  • 处理指令:通过处理指令来通知其他应用程序来处理非XML格式的数据,格式为<?xml-stylesheet href="hello.css" type="text/css"?>

  XML文档的根元素被称为文档元素,它和在其外部出现的处理指令、注释等作为文档实体的子节点,根元素本身和其内部的子元素也是一棵树。

二、XML文档解析

   在解析XML文档时,通常是利用现有的XML解析器对XML文档进行分析,应用程序通过解析器提供的API接口得到XML数据。

  XML解析方式分为两种:DOM和SAX:

  DOM:用来解析相对较小的XML文件,容易增删改查。DOM的核心是节点,DOM在解析XML文档时,将组成文档的各个部分映射为一个对象,这个对象就叫做节点。使用DOM解析XML文档,需要将读入整个XML文档,然后在内存中创建DOM树,生成DOM树上的每个节点对象。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <书架>
  3. <书>
  4. <作者>李阳</作者>
  5. <价格>39元</价格>
  6. <出版社>高等教育出版社</出版社>
  7. </书>
  8. <书>
  9. <作者>宋吉</作者>
  10. <价格>40元</价格>
  11. <出版社>人民出版社</出版社>
  12. </书>
  13. </书架>

  使用DOM解析上述XML文档,代码如下:

  1. package com.test.xml;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import javax.xml.parsers.DocumentBuilder;
  5. import javax.xml.parsers.DocumentBuilderFactory;
  6. import javax.xml.parsers.ParserConfigurationException;
  7. import org.w3c.dom.Document;
  8. import org.w3c.dom.Element;
  9. import org.w3c.dom.Node;
  10. import org.w3c.dom.NodeList;
  11. import org.xml.sax.SAXException;
  12. public class Demo
  13. {
  14. public static void main(String args[])
  15. {
  16. //得到DOM解析器工厂类的实例
  17. DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
  18. try
  19. {
  20. //得到dom的解析器对象
  21. DocumentBuilder db=dbf.newDocumentBuilder();
  22. //解析XML文档,得到代表文档的document对象
  23. File file=new File("D:\\Eclipse\\workSpace\\day_050401\\src\\book.xml");
  24. Document doc=db.parse(file);
  25.  
  26. //以文档顺序返回标签名字为书的所有后代元素
  27. NodeList nl=doc.getElementsByTagName("书");
  28.  
  29. for(int i=0;i<nl.getLength();i++)
  30. {
  31. Element elt=(Element) nl.item(i);
  32. Node eltAuthor=elt.getElementsByTagName("作者").item(0);
  33. Node eltPricer=elt.getElementsByTagName("价格").item(0);
  34. Node eltPublish=elt.getElementsByTagName("出版社").item(0);
  35.  
  36. String Author=eltAuthor.getFirstChild().getNodeValue();
  37. String Pricer=eltPricer.getFirstChild().getNodeValue();
  38. String Publish=eltPublish.getFirstChild().getNodeValue();
  39.  
  40. System.out.println("-------书籍信息"+(i+1)+"-------");
  41. System.out.println("作者:"+Author);
  42. System.out.println("价格:"+Pricer);
  43. System.out.println("出版社:"+Publish);
  44. }
  45.  
  46. }
  47. catch (ParserConfigurationException e)
  48. {
  49. // TODO 自动生成的 catch 块
  50. e.printStackTrace();
  51. }
  52. catch (SAXException e)
  53. {
  54. // TODO 自动生成的 catch 块
  55. e.printStackTrace();
  56. } catch (IOException e)
  57. {
  58. // TODO 自动生成的 catch 块
  59. e.printStackTrace();
  60. }
  61.  
  62. }
  63. }

  执行结果如下: 

 

  SAX:内存消耗较小,适合读取操作。SAX是一种基于事件驱动的API,利用SAX解析XML文档涉及解析器和事件处理器两个部分。解析器负责读取XML文档,并向事件处理器发送事件,事件处理器则负责对事件作出相应,对传递的XML数据进行处理。

  使用SAX解析XML文档,代码如下:

  1. import java.io.File;
  2. import java.io.IOException;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import javax.xml.parsers.ParserConfigurationException;
  6. import javax.xml.parsers.SAXParser;
  7. import javax.xml.parsers.SAXParserFactory;
  8. import org.xml.sax.Attributes;
  9. import org.xml.sax.SAXException;
  10. import org.xml.sax.XMLReader;
  11. import org.xml.sax.helpers.DefaultHandler;
  12. class Book
  13. {
  14. private String name;
  15. private String author;
  16. private String price;
  17. public String getName()
  18. {
  19. return name;
  20. }
  21. public void setName(String name)
  22. {
  23. this.name = name;
  24. }
  25. public String getAuthor()
  26. {
  27. return author;
  28. }
  29. public void setAuthor(String author)
  30. {
  31. this.author = author;
  32. }
  33. public String getPrice()
  34. {
  35. return price;
  36. }
  37.  
  38. public void setPrice(String price)
  39. {
  40. this.price = price;
  41.  
  42. }
  43.  
  44. }
  45. public class Demo extends DefaultHandler
  46. {
  47. private List list=new ArrayList();
  48. private String currentTag;
  49. private Book book;
  50. @Override
  51. public void startElement(String uri, String localName, String name,
  52. Attributes attributes) throws SAXException
  53. {
  54. currentTag=name;
  55. if("书".equals(currentTag))
  56. {
  57. book=new Book();
  58. }
  59. }
  60. @Override
  61. public void characters(char[] ch, int start, int length)
  62. throws SAXException
  63. {
  64. if("出版社".equals(currentTag))
  65. {
  66. String name=new String(ch,start,length);
  67. book.setName(name);
  68. }
  69. if("作者".equals(currentTag))
  70. {
  71. String author=new String(ch,start,length);
  72. book.setAuthor(author);
  73. }
  74. if("价格".equals(currentTag))
  75. {
  76. String price=new String(ch,start,length);
  77. book.setPrice(price);
  78. }
  79. }
  80. @Override
  81. public void endElement(String uri, String localName, String name)
  82. throws SAXException
  83. {
  84. if(name.equals("书"))
  85. {
  86. list.add(book);
  87. book=null;
  88. }
  89. currentTag=null;
  90. }
  91. public List getBooks()
  92. {
  93. return list;
  94. }
  95. public static void main(String []args)
  96. {
  97. //1.创建解析工厂
  98. SAXParserFactory factory=SAXParserFactory.newInstance();
  99. SAXParser sp=null;
  100. try
  101. {
  102. //2.得到解析器
  103. sp=factory.newSAXParser();
  104. //3、得到读取器
  105. XMLReader reader=sp.getXMLReader();
  106. File file=new File("D:\\Eclipse\\workSpace\\day_050401\\src\\book.xml");
  107. //4.设置内容处理器
  108. Demo handle=new Demo();
  109. //reader.setContentHandler(handle);
  110. sp.parse(file,handle);
  111. //5.读取xml文档内容
  112. List<Book> list=handle.getBooks();
  113. for(int i=0;i<list.size();i++)
  114. System.out.println(list.get(i).getAuthor()+"----"+list.get(i).getName()+"-----"+list.get(i).getPrice());
  115. }
  116. catch (ParserConfigurationException e)
  117. {
  118. // TODO 自动生成的 catch 块
  119. e.printStackTrace();
  120. }
  121. catch (SAXException e)
  122. {
  123. // TODO 自动生成的 catch 块
  124. e.printStackTrace();
  125. }
  126. catch (IOException e)
  127. {
  128. // TODO 自动生成的 catch 块
  129. e.printStackTrace();
  130. }
  131. }
  132. }

  运行结果如下:

三、dom4j解析XML文档

  dom4j也是一种用于解析XML文档的开放源代码的Java库。下载地址http://sourceforge.net/projects/dom4j/

  使用dom4j进行读取XMl文档操作,代码如下:

  1. import java.io.FileOutputStream;
  2. import java.io.FileWriter;
  3. import java.io.IOException;
  4. import java.io.OutputStreamWriter;
  5. import java.security.KeyStore.Entry.Attribute;
  6.  
  7. import org.dom4j.Document;
  8. import org.dom4j.DocumentException;
  9. import org.dom4j.Element;
  10. import org.dom4j.io.OutputFormat;
  11. import org.dom4j.io.SAXReader;
  12. import org.dom4j.io.XMLWriter;
  13. import org.junit.Test;
  14.  
  15. public class Demo
  16. {
  17. //读取xml文件第二本书的出版社
  18. @Test
  19. public void read()
  20. {
  21. SAXReader reader = new SAXReader();
  22. try
  23. {
  24. Document document = reader.read("C:\\Users\\Administrator\\Desktop\\book.xml");
  25. Element root =document.getRootElement();
  26. Element book=(Element)root.elements("书").get(1);
  27. String value=book.element("出版社").getText();
  28. System.out.println(value);
  29. }
  30. catch (DocumentException e)
  31. {
  32. // TODO 自动生成的 catch 块
  33. e.printStackTrace();
  34. }
  35. }
  36.  
  37. //在第二本书上添加一个书名:<书名>平凡的世界</书名>
  38. @Test
  39. public void add() throws DocumentException, IOException
  40. {
  41. SAXReader reader = new SAXReader();
  42. Document document = reader.read("C:\\Users\\Administrator\\Desktop\\book.xml");
  43.  
  44. Element book=(Element) document.getRootElement().elements("书").get(1);
  45. book.addElement("书名").setText("平凡的世界");
  46. //更新内存
  47. XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\book.xml"),"UTF-8"));
  48. writer.write(document);
  49. writer.close();
  50. }
  51. }

  运行结果:

  

  PS:如果你的项目经常需要更换解析器,建议使用DOM和SAX,这样当更换解析器时不需要更改任何代码,如果没有这样的需求,建议使用dom4j,简单而又强大。

XML的基本用法的更多相关文章

  1. [转]Animation 动画详解(一)——alpha、scale、translate、rotate、set的xml属性及用法

    转载:http://blog.csdn.net/harvic880925/article/details/39996643 前言:这几天做客户回访,感触很大,用户只要是留反馈信息,总是一种恨铁不成钢的 ...

  2. android.view.animation(1) - alpha、scale、translate、rotate、set的xml属性和用法(转)

    一.ScaleAnimation ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, floa ...

  3. 转:自定义控件三部曲之动画篇——alpha、scale、translate、rotate、set的xml属性及用法

    第一篇: 一.概述 Android的animation由四种类型组成:alpha.scale.translate.rotate,对应android官方文档地址:<Animation Resour ...

  4. python学习第四十九天XML模块的用法

    xml是实现不通语言或程序之间进行数据交换的协议,跟json差不多,但是json用起来简单,还没诞生json,以前都是用xml,下面讲述XML模块的用法. 1,导入xml模块 import xml 2 ...

  5. XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式

    XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD),作用是定义 XML 文档的合法构建模块,类似 DTD,但更加强大. 作用有: ①定义 ...

  6. Animation 动画详解(一)——alpha、scale、translate、rotate、set的xml属性及用法

    一.概述 Android的animation由四种类型组成:alpha.scale.translate.rotate,对应android官方文档地址:<Animation Resources&g ...

  7. 小白的Python之路 day5 模块XML特点和用法

    模块XML的特点和用法 一.简介 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今 ...

  8. SQLServer中sql for xml path 的用法

    我们通常需要获取一个多行的某个字段拼出的字符串,我们可以使用for xml path进行处理:下面将介绍for xml path的具体用法: 创建测试表&插入测试数据 在数据库中新增测试表 C ...

  9. 自定义控件三部曲之动画篇(一)——alpha、scale、translate、rotate、set的xml属性及用法

    前言:这几天做客户回访,感触很大,用户只要是留反馈信息,总是一种恨铁不成钢的心态,想用你的app,却是因为你的技术问题,让他们不得不放弃,而你一个回访电话却让他们尽释前嫌,当最后把手机号留给他们以便随 ...

  10. 28.XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式

    转自https://www.cnblogs.com/gdjlc/archive/2013/09/08/3308229.html XML Schema 语言也称作 XML Schema 定义(XML S ...

随机推荐

  1. 修改socket文件, MySQL启动报错

    事情是这样的, 我要搭建MySQL主从, 做读写分离, 然后就要了一台服务器搭建mysql, 最近犯懒, 就寻思搞一个二进制的吧直接启用 一堆问题就出现了 [ERROR] Can't start se ...

  2. qualcomm permission denied for tty device

    在app中访问串口,提示没有读写权限.本文记录解决方法. 调试 查看设备节点权限 shell@msm8909:/ # ll /dev/ttyHSL* crw------- root root 246, ...

  3. 10.11 Linux网络相关 10.12 firewalld和netfilter 10.13 netfilter5表5链介绍 10.14 iptables语法

    Linux网络相关 ifocnfig 查看网卡ip(yum install net-tools) ip add 查看网卡 ip add = ifocnfig ifconfig 不显示down掉的网卡, ...

  4. Macbook pro安装MacOS系统

    在app store 下载系统sierra; 打开磁盘工具,选择优盘,抹掉: 日志式,GUID分区: http://www.cnblogs.com/xiaobo-Linux/ 终端输入命令, sudo ...

  5. hibernate.cfg配置mysql方言

    hibernate自动建表,mysql高版本不支持 type=InnoDB 中的type关键字. 应该使用engine关键字 而非type 所以需要在hibernate.cfg.xml中配置方言.否则 ...

  6. 浏览器兼容css

    原文:https://www.cnblogs.com/shizk/p/8459362.html 1.为什么会出现浏览器兼容问题? 由于各大主流浏览器由不同的厂家开发,所用的核心架构和代码也很难重和,这 ...

  7. HttpURLConnection和HttpClient的区别(转)

    HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.在 JDK 的 java.net 包中已经提供了访问 ...

  8. 安卓开发笔记——TabHost组件(二)(实现底部菜单导航)

    上面文章<安卓开发复习笔记——TabHost组件(一)(实现底部菜单导航)>中提到了利用自定义View(ImageView+TextView)来设置一个底部菜单的样式 这边再补充一种更为灵 ...

  9. sar监控工具详解

    转自http://www.cnblogs.com/Amaranthus/p/3745680.html SAR NAME: SAR报告,收集,保存系统活动信息 语法: sar  [ -A ] [ -b ...

  10. 和我一起学《HTTP权威指南》——客户端识别与cookie机制

    客户端识别与cookie机制 服务器需要区别是哪个客户端. 个性化接触 HTTP是匿名.无状态的请求/响应协议. Web站点希望: 对客户端的用户有更多的了解 追踪用户浏览页面的行为 因此,产生了几种 ...