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解析的更多相关文章

  1. XML解析的二种方法之Sax解析

    package com.huawei.xml; import java.io.InputStream;import java.util.Stack; import javax.xml.parsers. ...

  2. python实现XML解析的三种方法

    python实现XML解析的三种方法 三种方法:一是xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOM API则该模块很适合:二是xml.sax.*模块,它是SAX API的实 ...

  3. 解析XML文件的几种常见操作方法—DOM/SAX/DOM4j

    解析XML文件的几种常见操作方法—DOM/SAX/DOM4j 一直想学点什么东西,有些浮躁,努力使自己静下心来看点东西,哪怕是回顾一下知识.看到了xml解析,目前我还没用到过.但多了解一下,加深点记忆 ...

  4. PHP怎么读写XML?(四种方法)

    PHP怎么读写XML?(四种方法) 一.总结 1.这四种方法中,字符串的方式是最原始的方法.SimpleXML和DOM扩展是属于基于树的解析器,把整个文档存储为树的数据结构中,需要把整个文档都加载到内 ...

  5. Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解

    Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解 一.Jquery遍历筛选数组 1.jquery grep()筛选遍历数组 $().ready( function(){ v ...

  6. IIS7.5使用web.config设置伪静态的二种方法

    转自 网上赚钱自学网 .http://www.whosmall.com/post/121 近几天公司里开发的项目有几个运行在IIS7.5上,由于全站采用的是伪静态,因此从网上找到两两种方法来实现.这两 ...

  7. mysql 远程连接数据库的二种方法

    http://blog.csdn.net/freecodetor/article/details/5799550 一.连接远程数据库: 1.显示密码 如:MySQL 连接远程数据库(192.168.5 ...

  8. .net中创建xml文件的两种方法

    .net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...

  9. mysql 远程连接数据库的二种方法

    一.连接远程数据库: 1.显示密码 如:MySQL 连接远程数据库(192.168.5.116),端口"3306",用户名为"root",密码"123 ...

随机推荐

  1. EPANET头文件解读系列7——MEMPOOL.H

    //EPANET应用程序使用了大量的节点与管段数据,而且每个对象数据又有不同时段的数据,这些数据占用了大量内存,而mempool.h就是一个简单快速的内存分配相关的头文件/***  mempool.h ...

  2. react native遇到的坑

    1.模拟器报错no bundle url present https://github.com/facebook/react-native/issues/12754 http://www.cnblog ...

  3. 报错:Syntax error on tokens, delete these tokens

    该问题意思是说:你有两个双引号或者你有没有关闭%>符号. 仔细检查代码 出现这样的错误一般是括号.中英文字符.中英文标点.代码前面的空格,尤其是复制粘贴的代码,去掉即可.

  4. Kafka术语解释

    前一篇文章介绍了如何使用kafka收发消息,但是对于kafka的核心概念并没有详细介绍,这里将会对包括kafka基本架构以及消费者.生产者API涉及的术语进行说明.了解这些术语有助于更深入理解kafk ...

  5. 使用eclipse启动系统时报错“ java.lang.OutOfMemoryError: PermGen space”问题的解决

    转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/76571611 本文出自[我是干勾鱼的博客] 有的时候,使用eclipse启动系统 ...

  6. HDU 3973 AC's String 字符串哈希

    HDU 3973 通过哈希函数将一个字符串转化为一个整数,通过特定的方式可以使得这个哈希值几乎没有冲突(这就是关键之处,几乎没有视为没有= =!, 其实也可以考虑实现哈希冲突时的处理,只是这道题没必要 ...

  7. JavaScript decodeURI()与decodeURIComponent() 使用与区别

    decodeURI()定义和用法:decodeURI()函数可对encodeURI()函数编码过的URI进行解码.语法:decodeURI(URIstring)参数描述:URIstring必需,一个字 ...

  8. 系列文章--WF学习资料汇总

    学习WF当然是MSDN作为第一手材料,但是看完了一些基础的入门知识后,园子里的一些WF大牛们的系列文章就是很好的提高的材料了.在此,感谢他们,我真佩服他们有这样的耐心和良好的学习习惯. 以下就是我经常 ...

  9. python把指定目录下的递归所有目录和文件名转换成小写或大写

    cat convert.py #!/usr/bin/env python # -*- coding:utf-8 -*- import os, sys def convert(rootdir, opty ...

  10. [原创]JEECMS 自定义标签调用广告版位下的所有广告(利用广告管理管理首页幻灯片)

    JEECMS自带的只有[@cms_advertising]标签,并且官方没有给文档,用法: [@cms_advertising id='3']             <img src=&quo ...