dom解析xml

为什么80%的码农都做不了架构师?>>>   hot3.png

转载自:http://www.cnblogs.com/shenliang123/archive/2012/05/11/2495252.html

使用eclipse需要手动导入crimson.jar包

org.w3c.dom(java dom)解析XML文档

位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效果可能会不理想

首先来了解点Java DOM 的 API:
1.解析器工厂类:DocumentBuilderFactory

创建的方法:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

2.解析器:DocumentBuilder

创建方法:通过解析器工厂类来获得 DocumentBuilder db = dbf.newDocumentBuilder();

3.文档树模型Document

创建方法:a.通过xml文档 Document doc = db.parse("bean.xml");  b.将需要解析的xml文档转化为输入流 InputStream is = new FileInputStream("bean.xml");

 Document doc = db.parse(is); 

Document对象代表了一个XML文档的模型树,所有的其他Node都以一定的顺序包含在Document对象之内,排列成一个树状结构,以后对XML文档的所有操作都与解析器无关,

直接在这个Document对象上进行操作即可;

 包含的方法:

4.节点列表类NodeList

NodeList代表了一个包含一个或者多个Node的列表,根据操作可以将其简化的看做为数组

5.节点类Node

Node对象是DOM中最基本的对象,代表了文档树中的抽象节点。但在实际使用中很少会直接使用Node对象,而是使用Node对象的子对象Element,Attr,Text等

6.元素类Element

是Node类最主要的子对象,在元素中可以包含属性,因而Element中有存取其属性的方法

7.属性类Attr

代表某个元素的属性,虽然Attr继承自Node接口,但因为Attr是包含在Element中的,但并不能将其看做是Element的子对象,因为Attr并不是DOM树的一部

基本的知识就到此结束,更加具体的大家可以参阅JDK API文档

 

实战:

1.使用DOM来遍历XML文档中的全部内容并且插入元素:

school.xml文档:

复制代码
<?xml version = "1.0" encoding = "utf-8"?>
<School><Student><Name>沈浪</Name><Num>1006010022</Num><Classes>信管2</Classes><Address>浙江杭州3</Address><Tel>123456</Tel></Student><Student><Name>沈1</Name><Num>1006010033</Num><Classes>信管1</Classes><Address>浙江杭州4</Address><Tel>234567</Tel></Student><Student><Name>沈2</Name><Num>1006010044</Num><Classes>生工2</Classes><Address>浙江杭州1</Address><Tel>345678</Tel></Student><Student><Name>沈3</Name><Num>1006010055</Num><Classes>电子2</Classes><Address>浙江杭州2</Address><Tel>456789</Tel></Student>
</School>
复制代码

DomDemo.java

复制代码
package xidian.sl.dom;import java.io.FileOutputStream;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;import org.apache.crimson.tree.XmlDocument;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;public class DomDemo {/*** 遍历xml文档* */public static void queryXml(){try{//得到DOM解析器的工厂实例DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();//从DOM工厂中获得DOM解析器DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();//把要解析的xml文档读入DOM解析器Document doc = dbBuilder.parse("src/xidian/sl/dom/school.xml");System.out.println("处理该文档的DomImplementation对象  = "+ doc.getImplementation());//得到文档名称为Student的元素的节点列表NodeList nList = doc.getElementsByTagName("Student");//遍历该集合,显示结合中的元素及其子元素的名字for(int i = 0; i< nList.getLength() ; i ++){Element node = (Element)nList.item(i);System.out.println("Name: "+ node.getElementsByTagName("Name").item(0).getFirstChild().getNodeValue());System.out.println("Num: "+ node.getElementsByTagName("Num").item(0).getFirstChild().getNodeValue());System.out.println("Classes: "+ node.getElementsByTagName("Classes").item(0).getFirstChild().getNodeValue());System.out.println("Address: "+ node.getElementsByTagName("Address").item(0).getFirstChild().getNodeValue());System.out.println("Tel: "+ node.getElementsByTagName("Tel").item(0).getFirstChild().getNodeValue());}}catch (Exception e) {// TODO: handle exception
            e.printStackTrace();}}/*** 向已存在的xml文件中插入元素* */public static void insertXml(){Element school = null;Element student = null;Element name = null;Element num = null;Element classes = null;Element address = null;Element tel = null;try{//得到DOM解析器的工厂实例DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();//从DOM工厂中获得DOM解析器DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();//把要解析的xml文档读入DOM解析器Document doc = dbBuilder.parse("src/xidian/sl/dom/school.xml");//得到文档名称为Student的元素的节点列表NodeList nList = doc.getElementsByTagName("School");school = (Element)nList.item(0);//创建名称为Student的元素student = doc.createElement("Student");//设置元素Student的属性值为231student.setAttribute("examId", "23");//创建名称为Name的元素name = doc.createElement("Name");//创建名称为 香香 的文本节点并作为子节点添加到name元素中name.appendChild(doc.createTextNode("香香"));//将name子元素添加到student中
            student.appendChild(name);/*** 下面的元素依次加入即可* */num = doc.createElement("Num");num.appendChild(doc.createTextNode("1006010066"));student.appendChild(num);classes = doc.createElement("Classes");classes.appendChild(doc.createTextNode("眼视光5"));student.appendChild(classes);address = doc.createElement("Address");address.appendChild(doc.createTextNode("浙江温州"));student.appendChild(address);tel = doc.createElement("Tel");tel.appendChild(doc.createTextNode("123890"));student.appendChild(tel);//将student作为子元素添加到树的根节点school
            school.appendChild(student);//将内存中的文档通过文件流生成insertSchool.xml,XmlDocument位于crison.jar下((XmlDocument)doc).write(new FileOutputStream("src/xidian/sl/dom/insertSchool.xml"));System.out.println("成功");}catch (Exception e) {// TODO: handle exception
            e.printStackTrace();}    }public static void main(String[] args){//读取
        DomDemo.queryXml();//插入
        DomDemo.insertXml();}
}
复制代码

 

运行后结果:

 


然后到目录下查看生成的xml文件:

打开查看内容:

上面添加元素后输出的文件与之前的文件不是同一个文件,如果需要输出到原文件中,那么只要将路径改为原文间路径即可:src/xidian/sl/dom/school.xml

 2.创建XML过程与插入过程相似,就是Document需要创建

复制代码
package xidian.sl.dom;import java.io.FileOutputStream;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;import org.apache.crimson.tree.XmlDocument;
import org.w3c.dom.Document;
import org.w3c.dom.Element;public class CreateNewDom {/*** 创建xml文档* */public static void createDom(){Document doc;Element school,student;Element name = null;Element num = null;Element classes = null;Element address = null;Element tel = null;try{//得到DOM解析器的工厂实例DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();//从DOM工厂中获得DOM解析器DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();//创建文档树模型对象doc = dbBuilder.newDocument();if(doc != null){//创建school元素school = doc.createElement("School");//创建student元素student = doc.createElement("Student");//设置元素Student的属性值为231student.setAttribute("examId", "23");//创建名称为Name的元素name = doc.createElement("Name");//创建名称为 香香 的文本节点并作为子节点添加到name元素中name.appendChild(doc.createTextNode("香香"));//将name子元素添加到student中
                student.appendChild(name);/*** 下面的元素依次加入即可* */num = doc.createElement("Num");num.appendChild(doc.createTextNode("1006010066"));student.appendChild(num);classes = doc.createElement("Classes");classes.appendChild(doc.createTextNode("眼视光5"));student.appendChild(classes);address = doc.createElement("Address");address.appendChild(doc.createTextNode("浙江温州"));student.appendChild(address);tel = doc.createElement("Tel");tel.appendChild(doc.createTextNode("123890"));student.appendChild(tel);//将student作为子元素添加到树的根节点school
                school.appendChild(student);//添加到文档树中
                doc.appendChild(school);//将内存中的文档通过文件流生成insertSchool.xml,XmlDocument位于crison.jar下((XmlDocument)doc).write(new FileOutputStream("src/xidian/sl/dom/createSchool.xml"));System.out.println("创建成功");}}catch (Exception e) {// TODO: handle exception
            e.printStackTrace();}}public static void main(String[] args) {CreateNewDom.createDom();}
}
复制代码

运行结果:

DOM的操作应该还是非常简单明了的,掌握了没哦。

 

 

 

 

转载于:https://my.oschina.net/zjcx/blog/679549

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

逃离北上广:你以为回到小城市就非常幸福了吗?

忘记在哪儿看的了。感觉不错&#xff0c;随手发出来。我博客也有更新&#xff0c;底下有留个人博客链接 在过去几年里。“逃离北上广”一直是一个热门短语。拿我自己来说&#xff0c;工作在上海&#xff0c;但又不是上海人。毕业后&#xff0c;就选择租房&#xff0c;首先就为这…

Redefinition of enumerator ios

添加文件之后 报 Redefinition of enumerator iOS 原因是&#xff1a;重复添加文件 仔细检查检查

[WinForm] VS2010发布、打包安装程序(超全超详细)

from: http://blog.csdn.net/y13156556538/article/details/555321841、 在vs2010 选择“新建项目”→“ 其他项目类型”→“ Visual Studio Installer→“安装项目”&#xff1a; &#xff08;如果是在solution中添加&#xff0c;就直接solution -- 右键 -- 添加project&#…

易货Beta版本发布说明

说明 由于前几天确实比较忙&#xff0c;所以没来得及写发布说明。 功能 我们在beta版本主要加入了以下几个功能&#xff1a; 一&#xff1a;增加了用户的发布界面 二&#xff1a;增加了用户的购买界面 三&#xff1a;使用下拉刷新取代了之前的handler后台更新 四&#xff1a;优…

【译】什么导致了Context泄露:Handler内部类

思考下面代码 1 public class SampleActivity extends Activity { 2 3 private final Handler mLeakyHandler new Handler() { 4 Override 5 public void handleMessage(Message msg) { 6 // ... 7 } 8 } 9 } 如果没有仔细观察&#xff0c;上面的代码…

js基础 one

js忽略空格符和换行符 js严格区分大小写 &#xff1b;为js的结束符 可以使用{}扩成一个语句组&#xff0c;形成一个block块 通过 \ 实现折行操作 document.write(hello \world); 通过document.write() 向文档书写内容 通过xonsole.log()向控制台写入内容变量 js变量重名会产…

关于.Net中Process和ProcessStartInfor的使用

System.Diagnostics.Process.Start(); 能做什么呢&#xff1f;它主要有以下几个功能&#xff1a;1、打开某个链接网址&#xff08;弹窗&#xff09;。2、定位打开某个文件目录。3、打开系统特殊文件夹&#xff0c;如“控制面板”等。那么它是怎么实现这几个功能的呢&#xff1f…

Sublime 的中文乱码问题

Sublime Text 是现在最受欢迎的文本编辑器&#xff0c;没有之一。它非常简洁&#xff0c;而且对各种代码的高亮显示很美观。但是&#xff0c;它默认不支持 GBK、Shift-JIS 等中文、日本编码格式&#xff0c;故打开此类文件会出现乱码。 安装 Package Control 首先要安装一个包控…

苹果应用上架遇到的问题(2017年4月27日)

在更新app store的时候报&#xff08;如图&#xff09;&#xff1a; ERROR ITMS-90086: "Missing 64-bit support. iOS apps submitted to the App Store must include 64-bit support and be built with the iOS 8 SDK or later. We recommend using the default "S…

工作者对象HttpWorkerRequest

在ASP.NET中&#xff0c;用于处理的请求&#xff0c;需要封装为HttpWorkerRequest类型的对象。该类为抽象类&#xff0c;定义在命名空间System.Web下。 #region Assembly System.Web.dll, v4.0.0.0 // C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFr…

C#输入输出重定向

当 Process 将文本写入其标准流中时&#xff0c;通常将在控制台上显示该文本。通过重定向 StandardOutput 流&#xff0c;可以操作或取消进程的输出。例如&#xff0c;可以筛选文本、用不同方式将其格式化&#xff0c;也可以将输出同时写入控制台和指定的日志文件中。有两种方式…

C语言笔试常考知识点

1. const 关键字 a) const int a; b) int const a; c) const int *a; d) int * const a; e) int const * const a; 解析&#xff1a; a) a为一个int型变量&#xff0c;在它被定义时就应当对其初始化&#xff0c;因为以后就没有机会再去改变它了。 b) 与 a) 是一个意思&a…

苹果应用上架,一些信息的勾选(2017年4月27日)

1、分级的各种选项的选择全部选否 &#xff08;我们公司是医疗相关的app&#xff0c;医疗的选项也是选择的否&#xff09; 2、

jsp页面路径问题

jsp路径默认不是项目跟路径 一、 <% page language"java" import"java.util.*" pageEncoding"utf-8"%> <% String path request.getContextPath(); String basePath request.getScheme() "://" request.getServerName() …

C# 线程池ThreadPool

什么是线程池&#xff1f;为什么要用线程池&#xff1f;怎么用线程池&#xff1f; 1. 什么是线程池&#xff1f;.NET Framework的ThreadPool类提供一个线程池&#xff0c;该线程池可用于执行任务、发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。那么什么是线程池…

苹果应用上架,图片的要求(2017年4月27日)

看这个提示应该就明白了吧。 哈哈&#xff0c;我还是自己再说一遍加深一下印象吧&#xff1a;如果应用在各个尺寸iphone屏幕上面外观一样&#xff0c;就只准备5.5英寸的图就可以了&#xff1b;如果有所不同&#xff0c;就按照实际情况&#xff0c;准备不同屏幕尺寸的图片即可。…

jQuery操作checkbox

2012欧洲杯"死亡之组"小组出线的国家队是&#xff1a;<br> <inputtype"checkbox"name"nation"value"Germany">德国 <inputtype"checkbox"name"nation"value"Denmark">丹麦 <input…

android Instrumentation 转载

Android提供了一系列强大的测试工具&#xff0c;它针对Android的环境&#xff0c;扩展了业内标准的JUnit测试框架。尽管你可以使用JUnit测试Android工程&#xff0c;但Android工具允许你为应用程序的各个方面进行更为复杂的测试&#xff0c;包括单元层面及框架层面。Android测试…

Linker command failed with exit code 1(use -v to see invocation)

Linker command failed with exit code 1(use -v to see invocation) 出现这个问题的原因是&#xff1a;工程当中存在相同的文件&#xff0c;找到该文件将其删除即可

【C#学习笔记】使用C#中的Dispatcher

form:https://www.jianshu.com/p/0714fc755988之前的文章说过了如何使用BackgroundWorker&#xff0c;今天要说的是WPF程序员处理多线程的另外一个方式 - Dispatcher当我们打开一个WPF应用程序即开启了一个进程&#xff0c;该进程中至少包含两个线程。一个线程用于处理呈现&…