例:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore><book id="1" name='book1'><name>挪威的森林</name><author>村上春树</author><year>2019</year><price>89</price></book><book id="2" name='book2'><name>设计模式</name><year>2018</year><price>386</price><language>English</language></book>
</bookstore>

DOM文档对象模型(10M文档时内存溢出)
优点:
1、形
成了树结构,有助于更好的理解、掌握,且代码容易编写。
2、解析过程中,树结构保存在内存中,方便修改。
缺点:
1、由于文件是一次性读取,所以对内存的耗费比较大。
2、如果XML文件比较大,容易影响解析性能且可能会造成内存溢出。

 public static void main(String[] args) {//创建一个DocumentBuilderFactory的对象DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();//创建一个DocumentBuilder的对象try {//创建DocumentBuilder对象DocumentBuilder db = dbf.newDocumentBuilder();//通过DocumentBuilder对象的parser方法加载data.xml文件到当前项目下Document document = db.parse("src/com/xml/data.xml");//获取所有book节点的集合NodeList bookList = document.getElementsByTagName("book");//通过nodelist的getLength()方法可以获取bookList的长度System.out.println("book节点个数【" + bookList.getLength() + "】");//遍历每一个book节点for (int i = 0; i < bookList.getLength(); i++) {System.out.println("=================下面开始遍历第" + (i + 1) + "个节点=================");//通过 item(i)方法 获取一个book节点,nodelist的索引值从0开始Node book = bookList.item(i);//获取book节点的所有属性集合NamedNodeMap attrs = book.getAttributes();//遍历book的属性for (int j = 0; j < attrs.getLength(); j++) {//通过item(index)方法获取book节点的某一个属性Node attr = attrs.item(j);//获取属性名System.out.print("属性名:" + attr.getNodeName());//获取属性值System.out.println("--属性值" + attr.getNodeValue());}//解析book节点的子节点NodeList childNodes = book.getChildNodes();//遍历childNodes获取每个节点的节点名和节点值for (int k = 0; k < childNodes.getLength(); k++) {//区分出text类型的node以及element类型的nodeif (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {//获取了element类型节点的节点名System.out.println("第" + (k + 1) + "个节点的节点名:"+ childNodes.item(k).getNodeName());//获取了element类型节点的节点值//System.out.println("--节点值是:" + childNodes.item(k).getTextContent());}}System.out.println("======================结束遍历第" + (i + 1) + "个节点=================");}}catch (Exception e) {e.printStackTrace();}        }

JDOM特征:(10M文档时内存溢出)
1、仅使用具体类,而不使用接口。
2、API大量使用了Collections类。

private static ArrayList<Book> booksList = new ArrayList<Book>();public static void main(String[] args) {// 1.创建一个SAXBuilder的对象SAXBuilder saxBuilder = new SAXBuilder();InputStream in;try {// 2.创建一个输入流,将xml文件加载到输入流中in = new FileInputStream("src/com/xml/data.xml");InputStreamReader isr = new InputStreamReader(in, "UTF-8");// 3.通过saxBuilder的build方法,将输入流加载到saxBuilder中Document document = saxBuilder.build(isr);// 4.通过document对象获取xml文件的根节点Element rootElement = document.getRootElement();// 5.获取根节点下的子节点的List集合List<Element> bookList = rootElement.getChildren();// 继续进行解析for (Element book : bookList) {Book bookEntity = new Book();System.out.println("======开始解析第" + (bookList.indexOf(book) + 1)+ "书======");// 解析book的属性集合List<Attribute> attrList = book.getAttributes();// //知道节点下属性名称时,获取节点值// book.getAttributeValue("id");// 遍历attrList(针对不清楚book节点下属性的名字及数量)for (Attribute attr : attrList) {// 获取属性名String attrName = attr.getName();// 获取属性值String attrValue = attr.getValue();System.out.println("属性名:" + attrName + "----属性值:"+ attrValue);if (attrName.equals("id")) {bookEntity.setId(attrValue);}}// 对book节点的子节点的节点名以及节点值的遍历List<Element> bookChilds = book.getChildren();for (Element child : bookChilds) {System.out.println("节点名:" + child.getName() + "----节点值:"+ child.getValue());if (child.getName().equals("name")) {bookEntity.setName(child.getValue());}else if (child.getName().equals("author")) {bookEntity.setAuthor(child.getValue());}else if (child.getName().equals("year")) {bookEntity.setYear(child.getValue());}else if (child.getName().equals("price")) {bookEntity.setPrice(child.getValue());}else if (child.getName().equals("language")) {bookEntity.setLanguage(child.getValue());}}System.out.println("======结束解析第" + (bookList.indexOf(book) + 1)+ "书======");booksList.add(bookEntity);bookEntity = null;System.out.println(booksList.size());System.out.println(booksList.get(0).getId());System.out.println(booksList.get(0).getName());}}catch (Exception e) {e.printStackTrace();}}

XML简单应用程序接口
优点:
1、采用事件驱动模式,对内存耗费比较小。 
2、适用于只处理XML文件中的数据时。
缺点:
1、编码比较麻烦。
2、很难同时访问XML文件中的多处不同数据。

SAXParserFactory factory = SAXParserFactory.newInstance();try {SAXParser parser = factory.newSAXParser();SAXParserHandler handler = new SAXParserHandler();parser.parse("src/com/xml/data.xml", handler);System.out.println("~!~!~!共有" + handler.getBookList().size() + "本书");for (Book book : handler.getBookList()) {System.out.println(book.getId());System.out.println(book.getName());System.out.println(book.getAuthor());System.out.println(book.getYear());System.out.println(book.getPrice());System.out.println(book.getLanguage());System.out.println("----finish----");}} catch (Exception e) {e.printStackTrace();}}
String value = null;Book book = null;private ArrayList<Book> bookList = new ArrayList<Book>();public ArrayList<Book> getBookList() {return bookList;}int bookIndex = 0;/*** 用来标识解析开始*/@Overridepublic void startDocument() throws SAXException {super.startDocument();System.out.println("SAX解析开始");}/*** 用来标识解析结束*/@Overridepublic void endDocument() throws SAXException {super.endDocument();System.out.println("SAX解析结束");}/*** 解析xml元素*/@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {//调用DefaultHandler类的startElement方法super.startElement(uri, localName, qName, attributes);if (qName.equals("book")) {bookIndex++;//创建一个book对象book = new Book();//开始解析book元素的属性System.out.println("======================开始遍历某一本书的内容=================");//不知道book元素下属性的名称以及个数,如何获取属性名以及属性值int num = attributes.getLength();for(int i = 0; i < num; i++){System.out.print("book元素的第" + (i + 1) +  "个属性名是:"+ attributes.getQName(i));System.out.println("---属性值是:" + attributes.getValue(i));if (attributes.getQName(i).equals("id")) {book.setId(attributes.getValue(i));}}}else if (!qName.equals("name") && !qName.equals("bookstore")) {System.out.print("节点名是:" + qName + "---");}}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {//调用DefaultHandler类的endElement方法super.endElement(uri, localName, qName);//判断是否针对一本书已经遍历结束if (qName.equals("book")) {bookList.add(book);book = null;System.out.println("======================结束遍历某一本书的内容=================");}else if (qName.equals("name")) {book.setName(value);}else if (qName.equals("author")) {book.setAuthor(value);}else if (qName.equals("year")) {book.setYear(value);}else if (qName.equals("price")) {book.setPrice(value);}else if (qName.equals("language")) {book.setLanguage(value);}}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {// TODO Auto-generated method stubsuper.characters(ch, start, length);value = new String(ch, start, length);if (!value.trim().equals("")) {System.out.println("节点值是:" + value);}}

解析XML报文--------DOM、JDOM、SAX相关推荐

  1. 解析XML方式-DOM,SAX

    students.xml <?xml version="1.0" encoding="UTF-8"?> <students><st ...

  2. Java解析XML报文内容及标签属性

    前言 JSON格式的报文解析,虽然json串短小精悍,也能有效表达层次结构,但是每个元素只能找到对应的元素值,不能体现更丰富的样式特征.比如某个元素除了要传输它的字符串文本,还想传输该文本的类型.字体 ...

  3. pythonxml解析拿到控件坐标_Python解析xml中dom元素的方法

    本文实例讲述了Python解析xml中dom元素的方法.共享给大家供大家参考.详细实现方法如下: 复制代码 代码如下: from xml.dom import minidom try: xmlfile ...

  4. Java中Xml解析详解 DOM、SAX、JDOM、DOM4J

    1.1 什么是XML 一种表示结构化信息的标准方法,以使计算机能够方便地使用此类信息,并且人们可以非常方便地编写和理解这些信息.XML 是 eXtensible Markup Language(可扩展 ...

  5. java sax xml文件解析_java解析xml文件-DOM/SAX

    java解析xml文件的两种方式 1:DOM 原理:把整个文档加载到内存,转化成dom树,之后应用程序可以随机的访问dom树的任何数据,灵活 快,但消耗内存 一个简单的xml 使用java解析 //b ...

  6. SAX解析xml (遍历DOM树各节点)

    本文参考 http://yangjunfeng.iteye.com/blog/401377 1. books.xml 1 <?xml version="1.0" encodi ...

  7. java解析xml报文_java 如何解析http请求返回的xml报文

    xml报文解析方法有很多种,此处采用dom4j的方法. dom4j的jar包下载地址:https://dom4j.github.io/# 1.request.getInputStream()和new ...

  8. JAVA解析xml报文

    目录 问题需求 响应报文格式 1,开发导入的依赖 2,开发样例 3,测试结果 问题需求 在工作中此项目请求指定项目之后,项目会返回一个xml报文格式的响应,此时我需要判断返回的报文是否是成功的响应报文 ...

  9. Java 解析 XML 报文示例

    在与其他公司,尤其是国企项目(如公安系统,银保监等系统)对接接口时,对方经常要求入参或者返回参数需要传 XML 格式报文. 请求他们接口需要自己将参数拼接成XML格式,获取他们返回参数时,需要根据接口 ...

最新文章

  1. jsonobject中getkey_FastJson中JSONObject用法及常用方法总结
  2. 面对峰值响应冲击,解决高并发的三大策略
  3. 原生input和onchange
  4. 如何使用QXDM 的1477项 转化utc时间
  5. 爬虫爬取下载qq音乐,又跟新的风口相关?(附源码和资料)
  6. eclipse svn 没有 connector
  7. redhat linux iso下载
  8. java 串口通信读取电子秤
  9. 贪心算法哈夫曼java_贪心算法_哈夫曼编码问题(Huffman Coding)
  10. Java 2.1(将摄氏温度转换为华氏温度)编写程序,从控制台读入double型摄氏温度,然后将其转换为华氏温度,并显示结果。
  11. 传统3D游戏引擎的Web化
  12. R统计绘图-corrplot热图绘制细节调整2(更改变量可视化顺序、非相关性热图绘制、添加矩形框等)
  13. 4--STM32RCC时钟树
  14. 计算机学院工作总结报告,研究生工作总结报告
  15. 【FreeRTOS】06 临界段的保护——关中断和关调度
  16. jquery青蛙过河小游戏源码
  17. 如何使用Erdas拼接谷歌卫星地图
  18. 联想Z5王者归来,有一种骄傲叫ZUK铁粉
  19. 滑块识别,滑块验证码识别平台,验证码识别
  20. 外部系统接口稽核经验谈

热门文章

  1. 洪泛路由模拟(Java实现)
  2. lol无法启动计算机丢失,无法开启游戏相关问题
  3. 年终购物季,不得不看的营销”血拼“策略
  4. Openwrt tftp刷机
  5. 太阳能瓦片,古风与科技结合
  6. 写给开发人员的实用密码学 - 数字证书
  7. bzoj3884 上帝的集合
  8. bzoj3884上帝与集合的正确用法
  9. PostgreSQL 正则表达式替换-使用变量
  10. 第1章 安装Nginx及第三方模块