简单谈谈dom解析xml和html
前言
文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口。html,xml都是基于这个模型构造的。这也是一个W3C推出的标准。java,python,javascript等语言都提供了一套基于dom的编程接口。
java使用dom解析xml
一段xml文档, note.xml:
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to id="1">George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
我们先使用w3c dom解析该xml:
@Test
public void test() {
NodeList nodeList = doc.getChildNodes().item(0).getChildNodes();
System.out.println("xml size: " + nodeList.getLength());
for(int i = 0; i < nodeList.getLength(); i ++) {
Node node = nodeList.item(i);
System.out.println(node.getNodeType());
System.out.println(node.getNodeName());
}
}
输出:
xml size: 9
3
#text
1
to
3
#text
1
from
3
#text
1
heading
3
#text
1
body
3
#text
我们看到代码输出note节点的字节点的时候,有9个节点,但是xml文档中note节点实际上只有to、from、heading、body4个节点。 那为什么是9个呢,原因是这样的。
选取几个w3c规范中关于节点类型的描述:
| 节点类型 | 描述 | nodeName返回值 | nodeValue返回值 | 子元素 | 类型常量值 |
|---|---|---|---|---|---|
| Document | 表示整个文档(DOM 树的根节点) | #document | null | Element(max. one),Comment,DocumentType | 9 |
| Element | 表示 element(元素)元素 | element name | null | Text,Comment,CDATASection | 1 |
| Attr | 表示属性 | 属性名称 | 属性值 | Text | 2 |
| Text | 表示元素或属性中的文本内容。 | #text | 节点内容 | None | 3 |
| CDATASection | 表示文档中的 CDATA 区段(文本不会被解析器解析) | #cdata-section | 节点内容 | None | 4 |
| Comment | 表示注释 | #comment | 注释文本 | None | 8 |
更多细节请查看w3c DOM节点类型
下面解释一下文档节点的字节点的处理过程:

其中红色部分为Text节点,紫色部分是Element节点(只画了部分)。</body>后面的也是一个Element节点,所有4个Element节点,5个Text节点。
所以输出的内容中3 #text表示该节点是个Text节点,1 节点name是个Element节点,这与表格中表述的是一样的。
测试代码:
@Test
public void test1() {
NodeList nodeList = doc.getChildNodes().item(0).getChildNodes();
System.out.println("xml size: " + nodeList.getLength());
for(int i = 0; i < nodeList.getLength(); i ++) {
Node node = nodeList.item(i);
if(node.getNodeType() == Node.TEXT_NODE) {
System.out.println(node.getNodeValue().replace("\n","hr").replace(' ', '-'));
}
}
}

很明显,我们把空格和回车键替换打印后发现我们的结论是正确的。
测试代码:
@Test
public void test2() {
System.out.println("doc type: " + doc.getNodeType());
NodeList nodeList = doc.getChildNodes().item(0).getChildNodes();
Node secondNode = nodeList.item(1);
System.out.println("element [to] node type: " + secondNode.getNodeType());
System.out.println("element [to] node name: " + secondNode.getNodeName());
System.out.println("element [to] node value: " + secondNode.getNodeValue());
System.out.println("element [to] children len: " + secondNode.getChildNodes().getLength());
System.out.println("element [to] children node type: " + secondNode.getChildNodes().item(0).getNodeType());
System.out.println("element [to] children node value: " + secondNode.getChildNodes().item(0).getNodeValue());
System.out.println("element [to] children node name: " + secondNode.getChildNodes().item(0).getNodeName());
Node attNode = secondNode.getAttributes().item(0);
System.out.println("attr type: " + attNode.getNodeType());
}

输出结果跟表格中是一样的。
大家有兴趣的话其他类型的节点比如CDATA节点大家可以自行测试~
javascript使用dom解析html
html代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<div>
<p>gogogo</p>
</div>
</body>
</html>
js代码:
console.log(document.nodeType);
var div = document.getElementsByTagName("div")[0]; //9
console.log(div.nodeType); //1
for(var i = 0;i < div.childNodes.length; i ++) {
console.log(div.childNodes[i].nodeType);
}
分别输出9,1,3,1,3
跟我们在表格中对应~
总结
本次博客主要讲解了dom解析xml和html。 以前使用java解析xml的时候总是使用一些第三方库,比如jdom。 但是dom却是w3c的规范,不止java,包括javascript,python这些主流语言也都主持,有了规范,语言只是实现了这些规范而已。
简单谈谈dom解析xml和html的更多相关文章
- Java解析XML文档(简单实例)——dom解析xml
一.前言 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object ...
- DOM的概念和简单应用:使用DOM解析XML数据
概念:DOM是Document Object Model的简称,即文档数据模型. Oracle公司提供了JAXP(Java API for XML Processing)来解析XML.JAXP会把XM ...
- JAVA中使用DOM解析XML文件
XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...
- xml语法、DTD约束xml、Schema约束xml、DOM解析xml
今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的ht ...
- xml--通过DOM解析XML
此文章通过3个例子表示DOM方式解析XML的用法. 通过DOM解析XML必须要写的3行代码. step 1: 获得dom解析器工厂(工作的作用是用于创建具体的解析器) step 2:获得具体的dom解 ...
- POPTEST老李分享DOM解析XML之java
POPTEST老李分享DOM解析XML之java Java提供了两种XML解析器:树型解释器DOM(Document Object Model,文档对象模型),和流机制解析器SAX(Simple ...
- Java解析XML文档——dom解析xml
一.前言 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object M ...
- DOM解析XML文件例子
DOM解析XML文件是一次性将目标文件中的所有节点都读入,然后再进行后续操作的方式. 一般分为以下几步: 1. 定义好目标XML文件路径path . 2. 实例化DOM解析工厂对象 ,Document ...
- 使用DOM解析XML文档
简单介绍一下使用DOM解析XML文档,解析XML文件案例: <?xml version="1.0" encoding="UTF-8"?> -< ...
随机推荐
- JSON 数据使用方法
当同一个模板需要替换不同的数据显示的时候,如果数据量大点,用json很方便. json对象: var JSONObject= { "name":"Bill Gates&q ...
- 【译】Java中的对象序列化
前言 好久没翻译simple java了,睡前来一篇. 译文链接: http://www.programcreek.com/2014/01/java-serialization/ 什么是对象序列化 在 ...
- Linux SendMail发送邮件失败诊断案例(三)
一Linux服务器突然发送不出邮件,检查了很多地方都没有发现异常,检查/var/log/maillog发现如下具体信息: Apr 12 00:36:04 mylinux sendmail[4685]: ...
- mysql错误一例:ERROR 1030 (HY000): Got error 28 from storage engine
在使用mysqldump导出一份建库脚本是,发生了下面的错误: 当执行 desc table_name; 时也报错: tag为表名,show index from tag;倒是可以执行. 其实真正的错 ...
- 按Enter键后Form表单自动提交的问题
怪事年年有,今年特别多. 话说,最近项目中遇到一件怪事,当我鼠标focus在文本框中,轻轻敲了下回车键,尼玛页面突然刷新了,当时把宝宝给吓得. 接下来就是一番苦逼的烧脑和蛋疼~ 一.被表象所迷惑 突然 ...
- Mysql数据库上修改日期-->造数据
这次要给客户安装测试ineedle设备,但是安装后不会立刻有数据显示,不能够全面的展示给用户web界面的一些信息.此时需要有一个公网服务器能够展示一下ineedle统计数据,但是公司58设备上没有流量 ...
- redis安装及基础操作(1)
============================================================= 编译安装 0.环境 Linux:centos6.5 redis:3.0.5 ...
- PowerShell命令卸载Win10内置应用
Windows10系统预装了大批的应用,开始菜单右侧的磁贴即显示了其中的大部分,包括:人脉.日历.邮件.资讯.Xbox.Groove音乐.Camera相机.电影和电视.照片.手机助手.天气.OneNo ...
- ExtJs4 笔记(14) layout 布局
作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)版权声明:本文的版权归作者与博客园共有.转载时须注明本文的详细链接,否则作者将保留追究其法律 ...
- 关于AngularJs中的路由学习总结
AngularJs中的路由,应用比较广泛,主要是允许我们通过不同的url访问不同的内容,可实现多视图的单页web应用.下面看看具体怎么使用. 关于路由 通常我们的URL形式为http://jtjds ...