XML的解析简介:

  在学习JavaScript时,我们用的DOM来解析HEML文档,根据HTML的层级结构在内存中分配一个树形结构,把HTML的标签啊,属性啊和文本之类的都封装成对象。

  比如:document对象,element对象,属性对象,文本对象,Node结点对象

我们通常有两种方式来解析XML:DOM和SAX

  DOM解析方式:

    其实跟HTML差不多的,也是根据XML的层级结构在内存中分配一个树形结构,把XML的标签,属性和文本都封装成对象。

    缺点:如果文件过大的话,就和造成内存溢出。

    优点:可以很方便实现增删改操作。

  SAX解析方式:

    采用事件驱动,从上到下,一行一行的解析,边读边解析。解析到某一个对象时,返回对象名称。

    缺点:不能实现增删改操作

    优点:不会内存溢出,可以方便实现查询操作。

解析器:

  在解析XML时,需要解析器。针对DOM和SAX,不同的公司和组织向我们提供了不同的解析器。

  SUN公司:      jaxp

  dom4j组织:    dom4j

  jdom组织 :     jdom

  在实际开发中,dom4j用的最多

jaxp:

  jaxp解析器在JDK的javax.xml.parsers包里面。针对dom和sax分别提供了解析器:

    dom:  DocumentBuilder:  解析器类

        DocumentBuilderFactory:  解析器工厂类

    sax:  SAXParser:  解析器类

        SAXParserFactory:  解析器工厂类

那么我们具体获得JAXP中的DOM解析器的方法如下:

  调用DocumentBuilderFactory.newInstance()方法得到创建DOM解析器的工厂。

  调用工厂对象的newDocumentBuilder()方法得到解析器对象。

  调用解析器对象的parse()方法解析XML文档,该方法的参数为XML文档的URL或者封装了XML路径的文件对象。即:parse(String uri)  parse(File f)

  示例:

     // 创建解析器工厂
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
// 获得解析器
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// 解析目标XML文件
Document document = documentBuilder.parse("src/OnePiece.xml");

通过上述步骤我们就能得到代表整个文档的Document对象,就可以利用DOM特性对整个XML文档进行操纵了。

  Document接口中常用的方法:

  

 NodeList getElementsByTagName(String tagname)     按文档顺序返回包含在文档中且具有给定标记名称的所Element的 NodeList。
Element createElement(String tagName)      创建指定类型的元素。
Text createTextNode(String data)        创建给定指定字符串的 Text 节点。

  Document的父接口Node中常用的方法:

Node appendChild(Node newChild)
将节点 newChild 添加到此节点的子节点列表的末尾。
Node removeChild(Node oldChild)
从子节点列表中移除 oldChild 所指示的子节点,并将其返回。
Node getParentNode()
此节点的父节点。
String getTextContent()
此属性返回此节点及其后代的文本内容。
void setTextContent(String textContent)
此属性返回此节点及其后代的文本内容。

  在得到的NodeList集合中有下列方法可以实现遍历:

int getLength()
列表中的节点数。
Node item(int index)
返回集合中的第 index 个项。

在对Document对象进行更新操作时,都是在内存中进行的。如果想要更直观地显示在XML文档中,需要进行回写操作。即:把Document对象又重新写入到XML文件中。

示例:

现有一个XML文档内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<海贼王>
<草帽海贼团>
<船长>路飞</船长>
<厨师>山治</厨师>
<航海士>娜美</航海士>
<船医>乔巴</船医>
<音乐家>贝多芬</音乐家> </草帽海贼团>
<草帽海贼团>
<副船长>索隆</副船长>
<考古学家>罗宾</考古学家>
<狙击手>乌索普</狙击手>
<船工>弗兰奇</船工>
</草帽海贼团>
</海贼王>

需求:将第一个<草帽海贼团>下面的<音乐家>内容贝多芬改为布鲁克

代码如下:

package com.alex;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList; /*
* 将第一个<草帽海贼团>下面的<音乐家>内容贝多芬改为布鲁克
*/
public class OnePieceTest3 {
public static void main(String[] args) throws Exception {
// 创建解析器
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// 解析目标XML文件
Document document = documentBuilder.parse("src/OnePiece.xml"); // 获得目标元素集合
NodeList list = document.getElementsByTagName("草帽海贼团"); Node node = list.item(0);
NodeList childNodes = node.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++) {
Node node2 = childNodes.item(j);
String nodeName = node2.getNodeName();
if (nodeName.equals("音乐家"))
node2.setTextContent("布鲁克");
}
// 回写
// 创建转换器
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/OnePiece.xml"));
}
}

修改后XML文档内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<海贼王>
<草帽海贼团>
<船长>路飞</船长>
<厨师>山治</厨师>
<航海士>娜美</航海士>
<船医>乔巴</船医>
<音乐家>布鲁克</音乐家>
</草帽海贼团>
<草帽海贼团>
<副船长>索隆</副船长>
<考古学家>罗宾</考古学家>
<狙击手>乌索普</狙击手>
<船工>弗兰奇</船工>
</草帽海贼团>
</海贼王>

2019-04-05

 

JavaWeb学习日记----XML的解析的更多相关文章

  1. JavaWeb学习日记----XML基础

    1.XML基础: XML全称为eXtensible Markup Language;即可扩展标记型语言,同HTML一样使用标签来操作.它的可扩展性体现在标签可以由自己定义,可以是中文标签. XML用途 ...

  2. JavaWeb学习日记----表单提交方式

    1.表单提交方式 (1) 使用input控件中的submit提交 代码如下: <!DOCTYPE html> <html lang="en"> <he ...

  3. JavaWeb学习——web.xml文件说明

    JavaWeb学习——web.xml文件说明 摘要:本文主要学习了web.xml文件的作用以及如果配置. 是什么 web.xml文件是用来在JavaWeb项目里面初始化配置信息的,比如:访问的首页.S ...

  4. JavaWeb学习笔记——XML解析

    DOM解析操作 只在跟节点<addresslist>下面建立一个子节点<name> <?xml version="1.0" encoding=&quo ...

  5. JavaScripts学习日记——XML DTD Schema

    今日关键词: XML DTD Schema 1.XML 1 XML的概述 1.1 什么是XML XML全称为Extensible Markup Language,意思是可扩展的标记语言.XML语法上和 ...

  6. JavaWeb学习日记----SAX解析XML

    1.SAX解析XML文档的方式: 与DOM方式解析不同,DOM方式解析是根据XML的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象.优点是可以很方便实现增删改操作.缺点是,如 ...

  7. Javaweb学习笔记——使用Jdom解析xml

    一.前言 Jdom是什么? Jdom是一个开源项目,基于树形结构,利用纯java的技术对XML文档实现解析,生成,序列化以及多种操作.它是直接为java编程服务,利用java语言的特性(方法重载,集合 ...

  8. JavaWeb学习笔记——XML和SAX解析区别

  9. 【javaweb学习】XML和约束模式

    xml:可扩展标记语言,w3c组织发布的,用于保存有关系的数据,作为配置文件,描述程序模块之间的关系 <?xml version="1.0" encoding="g ...

随机推荐

  1. 如何将自己的jar包发布到mavan中央仓库

    最近自己写了一个关于网关限流的插件,然后想着肯定会有很多兄弟也需要使用到,所以就想着把jar包上传到Maven的中央仓库上让大家可以更方便的使用 现在咱们来看一下这个流程是什么样的呢. 首先呢,你得去 ...

  2. Java核心技术卷一基础知识-第2章-Java程序设计环境-读书笔记

    第2章 Java程序设计环境 本章内容: 安装Java开发工具箱 使用集成开发环境 选择开发环境 运行图形化应用程序 使用命令行工具 建立并运行applet本章主要介绍如何安装Java开发工具箱(JD ...

  3. Git使用详细教程(4):git rm使用详解

    我们使用git rm 文件名来进行删除文件的操作. git rm index.php这个命令把工作区的index.php删除并暂存了. 如何撤回已暂存的删除命令? 上图中已经给出了提示,使用git r ...

  4. 字体图标-把SVG图标转换成所需要的字体图标

    小科普: 想必小伙伴们多少都了解或使用过字体图标,总体来说优点多于缺点,优点如下图: 任意缩放,图标不会失真: 可以改变图标颜色: 可以设置图标阴影: 可以设置透明效果: 主流浏览器都支持: 可以快速 ...

  5. 深入理解Java Stream流水线

    前面我们已经学会如何使用Stream API,用起来真的很爽,但简洁的方法下面似乎隐藏着无尽的秘密,如此强大的API是如何实现的呢?Pipeline是怎么执行的,每次方法调用都会导致一次迭代吗?自动并 ...

  6. mysql 开发基础系列3 日期数据类型

    日期类型 如果要用来表示年月日,通常用DATE 来表示. 如果要用来表示年月日时分秒,通常用DATETIME 表示. 如果只用来表示时分秒,通常用TIME 来表示. TIMESTAMP表示格式 :YY ...

  7. Struts1入门实例(简单登录)

    Struts1入门实例(简单登录) 现在开始加入公司的核心项目,但由于项目开发比较早,所以使用的技术不是很新潮,前台用的还是struts1. 虽然不是什么新技术,但仍可以从中学到好多东西的.花了一个晚 ...

  8. 在vue项目中添加特殊字体

    这里的特殊字体,指的是一般用户电脑未安装到本地的字体,要引入这样的字体,首先需要把字体文件下载下来. 就像上图这样的,ttf格式的,然后在项目里添加它. 然后我们在font.css里用@font-fa ...

  9. [Java 泥水匠] Java Components 之二:算法篇之项目实践中的位运算符(有你不懂的哦)

    作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节. 交流QQ群:[编程之美 365234583] ...

  10. ②泡茶看<数据结构>,喜欢看源码-栈ADT

    前言 听着天籁,我是个音乐迷.时间充实着,会过得很快.我马上也可以到傍晚的时候去乐室吹我心爱的萨克斯. 嘟嘟嘟... 我会吹一首简单的歌咯,哈哈我想到了一个神奇的比喻,待会说. 栈ADT模型(又称LI ...