XML解析的二种方法之dom解析
XML解析的二种方法:dom解析和sax解析
文件大小 存储位置 读取速度
dom解析 小文件 放在内存中 快
sax解析 大文件 硬盘中 慢 san解析是基于事件的
dom解析java代码
package com.huawei.xml;
import java.io.File;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
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.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class TestXML {
/**
* 得到 classpath中的文件
*
*
*/
public static void main(String[] args) throws Exception{
/**
* 首先得到 当前类所在的类加载器路劲
*
* 然后在根据一个资源的名字去得到该资源的输入流 如果没有 则返回null
*/
InputStream in = TestXML.class.getClassLoader().getResourceAsStream("com/cdsxt/resources/Users.xml");
//System.out.println(in);
//得到dom解析的解析器
//得到解析器的工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//通过工厂去得到解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//将文件的输入流解析为一个Document
Document doc = builder.parse(in);
//调用
//parser(doc);
//getSibling(doc);
updateXML(doc);
}
public static void parser(Document document){
//得到文档的跟标签
Element root = document.getDocumentElement();
//根据元素名称去得到 元素集合
NodeList nodes = root.getElementsByTagName("User");
//遍历元素
for(int i=0;i<nodes.getLength();i++){
Node node = nodes.item(i);
//强转 一定要知道 当前的这个实例的实际类型是什么
Element ele = (Element) node;
//System.out.println(ele.getAttribute("id"));
/*System.out.println(node.getNodeName());
System.out.println(node.getNodeValue());
System.out.println(node.getNodeType());*/
//得到所有的子节点
NodeList childs = ele.getChildNodes();
for(int j=0;j<childs.getLength();j++){
//得到每一个孩子元素
Node c = childs.item(j);
//需要去除 差异性
if(c.getNodeType() == 1){
System.out.println(c.getTextContent());
}
}
}
}
public static void getSibling(Document document){
//Element root = document.getDocumentElement();
//Element lisi = document.getElementById("users1");
//root.
Element users = document.getDocumentElement();
//System.out.println(lisi.getNodeName());
//得到Users节点的第一个子节点
Node first = users.getFirstChild();
Node user = first.getNextSibling();
//System.out.println(users.getFirstChild().getNodeName());
while(user.getNodeType()!=1){
user = user.getNextSibling();
}
System.out.println(user);
}
/**
* 修改XML
* @param document
*/
public static void updateXML(Document document) throws Exception{
//创建一个节点
Element user = document.createElement("User");
//创建一个age节点
Element age = document.createElement("age");
age.setTextContent("40");
user.appendChild(age);
document.getDocumentElement().appendChild(user);
//创建一个 用于得到转换器的 工厂
TransformerFactory factory = TransformerFactory.newInstance();
//得到一个从源到目标的 转换器 Transformer
Transformer transformer = factory.newTransformer();
//构建源数据
DOMSource src = new DOMSource(document);
//得到类路径下面的file
String filename = TestXML.class.getClassLoader().getResource("com/cdsxt/resources/Users.xml").getFile();
//创建目标
//StreamResult target = new StreamResult(new File("D:\\workspace\\TestXML\\src\\com\\cdsxt\\resources\\Users.xml"));
StreamResult target = new StreamResult(new File(filename));
//transformer.setOutputProperty(OutputKeys.ENCODING, "GBK");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(src, target);
}
}
User.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
这是xm注视
一个xml文档 只能有一个跟标签
关于声明信息 它的前面不允许出现任何字符
zhangsan 20 zhangsan@zhangsan.com it
-->
<Users>
<User id="lisi">
<username>lisi</username>
<age>20</age>
<email>lisi@lisi.com</email>
</User>
<User id="zhangsan">
<username>zhangsan</username>
<age>30</age>
<email>zhangsan@zhangsan.com</email>
</User>
<User>
<username>wangwu</username>
</User>
</Users>
XML解析的二种方法之dom解析的更多相关文章
- XML解析的二种方法之Sax解析
package com.huawei.xml; import java.io.InputStream;import java.util.Stack; import javax.xml.parsers. ...
- python实现XML解析的三种方法
python实现XML解析的三种方法 三种方法:一是xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOM API则该模块很适合:二是xml.sax.*模块,它是SAX API的实 ...
- 解析XML文件的几种常见操作方法—DOM/SAX/DOM4j
解析XML文件的几种常见操作方法—DOM/SAX/DOM4j 一直想学点什么东西,有些浮躁,努力使自己静下心来看点东西,哪怕是回顾一下知识.看到了xml解析,目前我还没用到过.但多了解一下,加深点记忆 ...
- PHP怎么读写XML?(四种方法)
PHP怎么读写XML?(四种方法) 一.总结 1.这四种方法中,字符串的方式是最原始的方法.SimpleXML和DOM扩展是属于基于树的解析器,把整个文档存储为树的数据结构中,需要把整个文档都加载到内 ...
- Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解
Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解 一.Jquery遍历筛选数组 1.jquery grep()筛选遍历数组 $().ready( function(){ v ...
- IIS7.5使用web.config设置伪静态的二种方法
转自 网上赚钱自学网 .http://www.whosmall.com/post/121 近几天公司里开发的项目有几个运行在IIS7.5上,由于全站采用的是伪静态,因此从网上找到两两种方法来实现.这两 ...
- mysql 远程连接数据库的二种方法
http://blog.csdn.net/freecodetor/article/details/5799550 一.连接远程数据库: 1.显示密码 如:MySQL 连接远程数据库(192.168.5 ...
- .net中创建xml文件的两种方法
.net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...
- mysql 远程连接数据库的二种方法
一.连接远程数据库: 1.显示密码 如:MySQL 连接远程数据库(192.168.5.116),端口"3306",用户名为"root",密码"123 ...
随机推荐
- jsp登录页面,展示错误信息,刷新页面后错误依然存在解决方案
在做登录页面的时候,通常使用form表单同步提交的方法进行提交的,也就是在form表单里去写action,如果登录失败,jsp通过jstl表达式获取错误信息展示在页面上,但是有一个问题就是,即使你刷新 ...
- Alpha阶段第1周Scrum立会报告+燃尽图 05
作业要求与https://edu.cnblogs.com/campus/nenu/2018fall/homework/2246相同 一.小组介绍 组长:刘莹莹 组员:朱珅莹 孙韦男 祝玮琦 王玉潘 周 ...
- js 的各种排序算法 -- 待续
链接 function quickSort(arr,l,r){ if(l < r){ var i = l, j = r, x = arr[i]; while(i<j){ while(i&l ...
- JS在项目中用到的AOP, 以及函数节流, 防抖, 事件总线
1. 项目中在绑定事件的时候总想在触发前,或者触发后做一些统一的判断或逻辑,在c#后端代码里,可以用Attribute, filter等标签特性实现AOP的效果,可是js中没有这种用法,归根到本质还是 ...
- 回首C语言关键字(~回首向来萧瑟处~)
开篇废话: 本文意在回顾 C 语言中的关键字,整理文件发现当时做的这些笔记还是蛮用心的,有临摹 前辈的足迹也有自己的理解和体会.时至今日2018已经跨过一半,对不起过去半年,今天 拿这篇关键字开篇,开 ...
- pycharm 设置py文件的默认模版头部信息
pycharm 设置py文件的默认模版头部信息,打开设置settings 进入File->settings->Editor->File and Code Templates-> ...
- Redis3.0集群
Redis集群介绍 Redis 集群是一个提供在多个Redis间节点间共享数据的程序集. Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性 ...
- java - 百钱百鸡小算法
传送门: 袁咩咩的小小博客 百钱百鸡是一个非常经典的不定方程问题,最早源于我国古代的<算经>,这是古代著名数学家张丘建首次提出的.百钱百鸡问题原文如下: 鸡翁一,值钱五,鸡母一,值钱三,鸡 ...
- 3——FFMPEG之解复用器-----AVInputFormat(转)
1. 数据结构: AVInputFormat为FFMPEG的解复用器对象,通过调用av_register_all(),FFMPEG所有的解复用器保存在以first_iformat为链表头的链表中,且还 ...
- bzoj2875随机数生成器
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2875 矩阵乘裸题. 如果直接乘的话会爆long long,所以用加法代替乘,过程中不断取模. ...