XML是一种数据表示形式。

  • 可以描述非常复杂的数据数据结构
  • 用于传输和传输数据

DOM:Document Object Model

DOM模型就是把XML文档作为一个树形结构,从根结点开始,每个节点都可以包含任意个字节点。

用Java解析XML时,

  • Document代表整个XML文档
  • Element表示元素
  • Attribute:属性
  • Comment表示注释

Java DOM核心API:

  1. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  2. DocumentBuilder db = dbf.newDocumentBuilder();
  3. Document doc = db.parse(XML_URL);
  4. Element root = doc.getDocumentElement(); //获取根结点的元素
  5. //从根结点document出发,可以便利所有的子节点,获取所有元素、属性、文本、数据、注释。每个Node都有自己的type,根据type来区分一个Node到底是元素,还是属性,还是文本。

遍历XML文件

  1. import org.w3c.dom.Document;
  2. import org.w3c.dom.Node;
  3. import javax.xml.parsers.DocumentBuilder;
  4. import javax.xml.parsers.DocumentBuilderFactory;
  5. public class DomSample {
  6. static final String XML_URL = "http://rss.sina.com.cn/tech/internet/home28.xml";
  7. public static void main(String[] args) throws Exception{
  8. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  9. DocumentBuilder db = dbf.newDocumentBuilder();
  10. Document doc = db.parse(XML_URL);
  11. printNode(doc,0);
  12. }
  13. static void printNode(Node n, int indent){
  14. for(int i=0;i<indent;i++){
  15. System.out.print(' ');
  16. }
  17. switch (n.getNodeType()){
  18. case Node.DOCUMENT_NODE://根节点
  19. System.out.println("Document:"+n.getNodeName());
  20. break;
  21. case Node.ELEMENT_NODE: //元素
  22. System.out.println("Element:"+n.getNodeName());
  23. break;
  24. case Node.TEXT_NODE: //字符
  25. System.out.println("Text:"+n.getNodeName()+"="+n.getNodeValue());
  26. break;
  27. case Node.ATTRIBUTE_NODE: //属性
  28. System.out.println("Attr:"+n.getNodeName()+"="+n.getNodeValue());
  29. break;
  30. case Node.CDATA_SECTION_NODE: //CDATA
  31. System.out.println("CDATA:"+n.getNodeName()+"="+n.getNodeValue());
  32. break;
  33. case Node.COMMENT_NODE: //注释
  34. System.out.println("Commment:"+n.getNodeName()+"="+n.getNodeValue());
  35. break;
  36. default:
  37. System.out.println("NodeType:"+n.getNodeType()+",NodeName:"+n.getNodeName());
  38. }
  39. for(Node child=n.getFirstChild();child != null;child=child.getNextSibling()){
  40. printNode(child, indent+1);
  41. }
  42. }
  43. }
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <bookstore>
  3. <book id="1" date="08/08/2008">
  4. <name>冰与火之歌</name>
  5. <author>乔治马丁</author>
  6. <year>2014</year>
  7. <price>89</price>
  8. </book>
  9. <book id="2">
  10. <name>安徒生童话</name>
  11. <year>2004</year>
  12. <price>77</price>
  13. <language>English</language>
  14. </book>
  15. </bookstore>
  1. public static void main(String[] args) throws Exception{
  2. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  3. DocumentBuilder db = dbf.newDocumentBuilder();
  4. Document doc = db.parse("./src/main/resources/test.xml");
  5. //通过元素名称解析得到所有子节点的集合
  6. NodeList books = doc.getElementsByTagName("book");
  7. for(int i=0;i<books.getLength();i++){
  8. Node book = books.item(i);
  9. NamedNodeMap mapOfAttr = book.getAttributes();
  10. //打印节点book的属性值
  11. for(int j=0;j<mapOfAttr.getLength();j++){
  12. Node nodeOfAttr = mapOfAttr.item(j);
  13. System.out.println(nodeOfAttr.getNodeName()+"\t"+nodeOfAttr.getNodeValue());
  14. }
  15. //获取节点book的子节点,并打印子节点名称和节点值
  16. NodeList childsOfBook = book.getChildNodes();
  17. for(int l=0;l<childsOfBook.getLength();l++){
  18. if(l%2 != 0){//节点共有9个,偶数节点没有内容
  19. Node childOfbook = childsOfBook.item(l);
  20. System.out.print(childOfbook.getNodeName()+"\t=\t");
  21. //闭合标签内部被认为是子节点
  22. Node grandchildNodeBook = childOfbook.getFirstChild();
  23. System.out.println(grandchildNodeBook.getNodeValue());
  24. }
  25. }
  26. }
  27. }

  1. public static void main(String[] args) throws Exception{
  2. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  3. DocumentBuilder db = dbf.newDocumentBuilder();
  4. Document doc = db.parse("./src/main/resources/test.xml");
  5. NodeList books2 = doc.getElementsByTagName("book");
  6. Node book = books.item(0);
  7. NodeList childsOfBook = book.getChildNodes();
  8. for(int l=0;l<childsOfBook.getLength();l++){
  9. System.out.println("全部子节点"+ childsOfBook.item(l).getNodeName());
  10. }
  11. }

总结:

Java DOM API:

  • 将XML解析为DOM
  • 可在内存中完整表示XML数据结构
  • 解析速度慢,内存占用大

学习链接https://blog.csdn.net/root_dream/article/details/61195793

廖雪峰Java14Java操作XML和JSON-1XML-2DOM的更多相关文章

  1. 廖雪峰Java14Java操作XML和JSON-2JSON-2处理JSON

    解析JSON JSR 353 API 常用的第三方库 * Jackson * gson * fastjson Jackson: 提供了读写JSON的API JSON和JavaBean可以互相转换 可食 ...

  2. 廖雪峰Java14Java操作XML和JSON-2JSON-1Json介绍

    JSON是一种类似JavaScript对象的数据表示格式 JavaScript Object Notation 去除了JavaScript的执行语句 仅保留数据 JSON格式: 仅保留UTF-8编码 ...

  3. 廖雪峰Java14Java操作XML和JSON-1XML-1XML介绍

    1.XML:可扩展标记语言(extensible Markup Language) 是一种数据表示格式 可以描述非常复杂的数据结构 用于存储和传输数据 1.1XML特点: 1.纯文本,默认utf-8编 ...

  4. 廖雪峰Java14Java操作XML和JSON-1XML-4第三方XML库

    总结: 使用Jackson可以快速在XML和JavaBean之间互相转换 可使用Annotation定制序列化和反序列化

  5. 廖雪峰Java14Java操作XML和JSON-1XML-3SAX

    SAX:Simple API for XML 基于事件的API import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXPars ...

  6. 廖雪峰js教程笔记9 json

    JSON是JavaScript Object Notation的缩写,它是一种数据交换格式. 在JSON出现之前,大家一直用XML来传递数据.因为XML是一种纯文本格式,所以它适合在网络上交换数据.X ...

  7. PHP7语法知识(四):目录文件操作、Cookie与Session、MySQL数据库的使用、Redis数据库、PHP处理XML与JSON

    目录文件操作 一.目录 1.判断文件类型: 2.创建和删除目录: 3.打开读取和关闭目录 4.获得路径中目录部分 5.目录磁盘空间 二.文件操作 1.打开文件: 2.读取文件: 3.获得文件属性: 4 ...

  8. 转 廖雪峰 urllib

    http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432688314740a0 ...

  9. 【.net 深呼吸】聊聊WCF服务返回XML或JSON格式数据

    有时候,为了让数据可以“跨国经营”,尤其是HTTP Web有关的东东,会将数据内容以 XML 或 JSON 的格式返回,这样一来,不管客户端平台是四大文明古国,还是处于蒙昧时代的原始部落,都可以使用这 ...

随机推荐

  1. python 测试框架nose

    python测试框架nose nose不是python自带模块,这里我才用pip的方式安装 pip install nose 这样就完成了安装,然后再确认下是否安装成功了,直接打开cmd输入noset ...

  2. OCP—051试题

    FROM: http://blog.itpub.net/26736162/viewspace-1252569/?page=2 http://blog.csdn.net/elearnings/artic ...

  3. MySQL基础管理

    1.用户管理 1.用户的作用: 登录:管理相对应的库表 2.定义 定义用户名和白名单 all@'10.0.0.%' 命名用户名时,最好不要太长,要和业务相关 白名单类型: user@'10.0.0.5 ...

  4. mybatis 处理枚举类型

    MyBatis支持持久化enum类型属性.假设t_user表中有一列gender(性别)类型为 varchar2(10),存储 MALE 或者 FEMALE 两种值.并且,User对象有一个enum类 ...

  5. 12-MySQL-Ubuntu-数据表的查询-数据准备和基本查询(一)

    一,数据准备 创建数据库.数据表 -- 创建数据库 create database python_test_1 charset=utf8; -- 使用数据库 use python_test_1; -- ...

  6. STM32---初学者用库函数好还是直接对寄存器操作比较好

    引用:http://blog.csdn.net/u010349006/article/details/416 首先,两个都是C语言.从51过渡过来的话,就先说寄存器操作.每个MCU都有自己的寄存器,5 ...

  7. java 打印1到n之间的整数

    package java_day08; /* * 打印1-n之间的整数 * * 递归:方法体自己调用自己 */ public class DiGui { public static void main ...

  8. JS对象 四舍五入round() round() 方法可把一个数字四舍五入为最接近的整数。 语法: Math.round(x)

    四舍五入round() round() 方法可把一个数字四舍五入为最接近的整数. 语法: Math.round(x) 参数说明: 注意: 1. 返回与 x 最接近的整数. 2. 对于 0.5,该方法将 ...

  9. SQL Server SQLGetData()

    { /* 语法 C++ SQLRETURN SQLGetData( SQLHSTMT StatementHandle, SQLUSMALLINT Col_or_Param_Num, SQLSMALLI ...

  10. 重磅发布: 阿里云WAF日志实时分析上线 (含视频)

    摘要: 阿里云WAF与日志服务打通,对外开发Web访问与攻击日志.提供近实时的网站具体的日志自动采集存储.并提供基于日志服务的查询分析.报表报警.下游计算对接与投递的能力. 背景 Web攻击形势 互联 ...