XML是一种数据表示形式。

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

DOM:Document Object Model

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

用Java解析XML时,

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

Java DOM核心API:

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

遍历XML文件

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

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

总结:

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. Xcode输出中文

    重写NSArray和NSDictionary分类Category就OK了! 导入头文件 #import <objc/runtime.h> + (void)load { static dis ...

  2. 重启集群的时候发现HBase的HRegionServer 服务启动失败

    今天在测试环境下的集群重启了下,启动Hbase的时候报错: $ sh start-hbase.sh starting master, logging to /home/hadoop/hbase-0.9 ...

  3. 【POJ】3259 Wormholes

    题目链接:http://poj.org/problem?id=3259 题意:n个农场,m条双向路径,w条单向路径(虫洞).单向虫洞路径是负值.农夫想知道自己能不能看到自己(X). 题解:其实刚开始没 ...

  4. SonarQube代码质量扫描持续集成

    1.安装JDK和配置JAVA_HOME和CLASSPATH 2.安装mysql数据库 3.创建数据库和用户 mysql -u root -p mysql> CREATE DATABASE son ...

  5. 关于js私钥加密公钥解密的问题

    博客荒废很久了,最近遇到一个问题,看网上的说明比较少,所以写下来给大家一个参考 一般来说rsa算法都是使用公钥加密,私钥解密,或者私钥签名,公钥验签.但总有特别的时候会想要用私钥加密,公钥解密,但是j ...

  6. iOS组件化开发-CocoaPods简介

    CocoaPods简介 任何一门开发语言到达一定阶段就会出现第三方的类库管理工具,比如Java的Maven.WEB的Webpack等.在iOS中类库的管理工具-CocoaPods. 利用CocoaPo ...

  7. The linux command 之定制提示符

    一.提示符分解 默认提示符如下所示: [me@linuxbox ~]$ 可以看出它包括我们的用户名.主机名.当前工作目录.提示符是由PS1变量定义的. [me@linuxbox ~]$ echo $P ...

  8. 2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据

    redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略.redis 提供 6种数据淘汰策略: voltile-lru:从已设置过期时间的数据集(server.db[i].expires) ...

  9. _proto_和prototype

    _proto_和prototype 实例对象中有一个属性,_proto_,也是对象,叫原型,不是标准的属性,浏览器使用的, 构造函数中有一个属性,Prototype,也是对象,叫原型,是标准属性,程序 ...

  10. 关于Qt5(1)-- 两个窗口互相切换的例子

    <QT Creator快速入门>这本书有一章介绍model和modeless的概念时,用到了两个窗口互相切换的例子.但是原文对该例子的说明非常模糊不清,现整理如下. 1,要求:登陆界面.主 ...