转自 http://blog.csdn.net/java958199586/article/details/7277904

一、XML解析技术概述

1.XML解析方式分为两种:dom和sax

(1)dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。

(2) sax:(Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。

2. XML解析器

Crimson、Xerces 、Aelfred2

XML解析开发包

Jaxp、Jdom、dom4j

(1)JAXP

JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包 及其子包组成

在 javax.xml.parsers 包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX 的解析器对象。

(2)使用JAXP进行DOM解析

javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。

(3)获得JAXP中的DOM解析器

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

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

调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。

(4)DOM编程

DOM模型(document object model)

DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。

在dom中,节点之间关系如下:

位于一个节点之上的节点是该节点的父节点(parent)

一个节点之下的节点是该节点的子节点(children)

同一层次,具有相同父节点的节点是兄弟节点(sibling)

一个节点的下一个层次的节点集合是节点后代(descendant)

父、祖父节点及所有位于节点上面的,都是节点的祖先(ancestor)

节点类型(下页ppt)

(5)Node对象

Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,就可以把Node节点转换成相应的节点对象(Node的子类对象),以便于调用其特有的方法。(查看API文档)

Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容了

二、DOM方式解析XML文件

1.更新XML文档

javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象 转换为某种格式后进行输出,例如把xml文件应用样式表后转成一个html文档。利用   这个对象,当然也可以把Document对象又重新写入到一个XML文件中。

Transformer类通过transform方法完成转换操作,该方法接收一个源和一个目的地。 我们可以通过:

javax.xml.transform.dom.DOMSource类来关联要转换的document对象,

用javax.xml.transform.stream.StreamResult 对象来表示数据的目的地。

Transformer对象通过TransformerFactory获得。

2.实例

(1)

public class Demo02 {

public static void main(String[] args) throws                           ParserConfigurationException, SAXException, IOException {

//获取dom解析的工厂

DocumentBuilderFactory factory =                                        DocumentBuilderFactory.newInstance();

//是否删除空格  false true

factory.setIgnoringElementContentWhitespace(true);

//获取解析器

DocumentBuilder builder = factory.newDocumentBuilder();

//把xml文档输入到解析器中,并获取xml文档对应的document对象

//Document document = builder.parse(new                                 //File("D:\\workspace\\20110309\\src\\book.xml"));

//Document document = builder.parse(new File("src\\book.xml"));

Document document = builder.parse(new                                   File("src\\cn\\csdn\\dom\\book.xml"));

System.out.println(document.getDocumentURI());

findNode(document);

}

//查询book元素中name元素第一个值

private static void findNode(Document document) {

NodeList nodeList = document.getElementsByTagName("name");

System.out.println(nodeList.getLength());

Node node = nodeList.item(0);

System.out.println(node.getTextContent());

}

}

(2)

public class Demo03 {

public void ready() {

}

// 遍历所有的xml文档中的内容

@Test

public void test1() throws Exception {

// 第一步:获取DocumentBuilderFactory工厂

DocumentBuilderFactory factory =                                        DocumentBuilderFactory.newInstance();

// 设置去掉空格的方法

factory.setIgnoringElementContentWhitespace(true);

// 获取解析器

DocumentBuilder builder = factory.newDocumentBuilder();

// 解析xml文档

Document document = builder.parse(new File("src\\dom.xml"));

//获取根节点对象

Element root = document.getDocumentElement();

/*//获取根节点元素名称

String tagname = root.getTagName();

System.out.println("根节点的名称是:"+root.getTagName());*/

//调用Node中的getChildNodes()获取根节点的子节点

NodeList Nlist = root.getChildNodes();

//遍历该子节点

display(Nlist);

}

//使用递归遍历个子节点中的子节点

public void display(NodeList Nlist){

for (int i = 0; i <Nlist.getLength(); i++) {

Node node = Nlist.item(i);

System.out.println(node.getNodeName());

if(node.hasChildNodes()){//判断该节点是否还有子节点

NodeList list = node.getChildNodes();

display(list);  //调用方法本身

}else{

if(node.getNodeType()==Node.TEXT_NODE){ //判断节点类型

System.out.println("         "+node.getTextContent());

}

//当没有子节点时跳出

break;

}

}

}

}

(3)

public class Demo04 {

@Test

/**解析商丘的人口这个这个属性*/

public void test1()throws Exception{

DocumentBuilderFactory factory =                                        DocumentBuilderFactory.newInstance();

DocumentBuilder builder  = factory.newDocumentBuilder();

Document document = builder.parse(new File("src\\dom.xml"));

NodeList list = document.getElementsByTagName("商丘");

Node node = list.item(0);

if(node.getNodeType()== Node.ELEMENT_NODE){

Element element = (Element)node;

String value = element.getAttribute("人口");

System.out.println("属性的值是:"+value);

}

}

@Test

public void test2()throws Exception{

DocumentBuilderFactory factory =    DocumentBuilderFactory.newInstance();

DocumentBuilder builder  = factory.newDocumentBuilder();

Document document = builder.parse(new File("src\\dom.xml"));

Element element =  document.getElementById("attr");

String value = element.getAttribute("id");

String value1 = element.getAttribute("人口");

System.out.println("属性的值是:"+value+"   "+value1);

}

}

(4)

public class Demo05 {

@Test

public void test2()throws Exception{

DocumentBuilderFactory factory =                                        DocumentBuilderFactory.newInstance();

//      factory.setIgnoringElementContentWhitespace(true);

DocumentBuilder builder  = factory.newDocumentBuilder();

Document doc = builder.newDocument();

doc.setXmlVersion("1.0");

Comment comment = doc.createComment("创建xml文件");

doc.appendChild(comment);

Element root = doc.createElement("学生");

Element name = doc.createElement("姓名");

name.appendChild(doc.createTextNode("rrrr"));

Element sex = doc.createElement("性别");

sex.setAttribute("name", "男");

root.appendChild(name);

root.appendChild(sex);

doc.appendChild(root);

TransformerFactory factory1 = TransformerFactory.newInstance();

Transformer tformer = factory1.newTransformer();

tformer.transform(new DOMSource(doc), new                               StreamResult("src\\ds.xml"));

}

}

(5)

public class Demo06 {

@Test

public void test()throws Exception{

DocumentBuilderFactory factory =                                            DocumentBuilderFactory.newInstance();

//          factory.setIgnoringElementContentWhitespace(true);

DocumentBuilder builder  = factory.newDocumentBuilder();

Document doc = builder.parse(new File("src\\dom.xml"));

Element element = doc.createElement("东北旺");

element.appendChild(doc.createTextNode("家"));

Node node = doc.getElementsByTagName("海淀").item(0);

node.appendChild(element);

TransformerFactory factory1 = TransformerFactory.newInstance();

Transformer tformer = factory1.newTransformer();

tformer.transform(new DOMSource(doc), new                                   StreamResult("src\\dom.xml"));

}

@Test

public void test1()throws Exception{

DocumentBuilderFactory factory =                                            DocumentBuilderFactory.newInstance();

//          factory.setIgnoringElementContentWhitespace(true);

DocumentBuilder builder  = factory.newDocumentBuilder();

Document doc = builder.parse(new File("src\\dom.xml"));

Node node = doc.getElementsByTagName("海淀").item(0);

node.removeChild(doc.getElementsByTagName("东北旺").item(2));

TransformerFactory factory1 = TransformerFactory.newInstance();

Transformer tformer = factory1.newTransformer();

tformer.transform(new DOMSource(doc), new                                   StreamResult("src\\dom.xml"));

}

@Test

public void test2()throws Exception{

DocumentBuilderFactory factory =                                            DocumentBuilderFactory.newInstance();

//          factory.setIgnoringElementContentWhitespace(true);

DocumentBuilder builder  = factory.newDocumentBuilder();

Document doc = builder.parse(new File("src\\dom.xml"));

Node node1 = doc.getElementsByTagName("东北旺").item(0);

node1.setTextContent("杀人");

TransformerFactory factory1 = TransformerFactory.newInstance();

Transformer tformer = factory1.newTransformer();

tformer.transform(new DOMSource(doc), new                                   StreamResult("src\\dom.xml"));

}

}

(6)book.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE books[

<!ELEMENT books (book*)>

<!ELEMENT book (name,author,price)>

<!ELEMENT name (#PCDATA)>

<!ELEMENT author (#PCDATA)>

<!ELEMENT price (#PCDATA)>

<!ATTLIST name length CDATA #IMPLIED>

]>

<books>

<book>

<name length="123">XML介绍</name>

<author>rrrr</author>

<price>100000</price>

</book>

<book>

<name>XML介绍1</name>

<author>rrrrr</author>

<price>100000</price>

</book>

</books>

更多 0

dom jaxp详解的更多相关文章

  1. dom对象详解--document对象(二)

       dom对象详解--style对象 style对象 style对象和document对象下的集合对象styleSheets有关系,styleSheets是文档中所有style对象的集合,这里讲解的 ...

  2. dom对象详解--document对象(一)

     document对象 Document对象代表整个html文档,可用来访问页面中的所有元素,是最复杂的一个dom对象,可以说是学习好dom编程的关键所在. Document对象是window对象的一 ...

  3. DOM API详解

    来源于:http://zxc0328.github.io/2016/01/23/learning-dom-part1/ https://zxc0328.github.io/2016/01/26/lea ...

  4. DOM——事件详解

    事件 事件:触发-响应机制 事件三要素 事件源:触发(被)事件的元素 事件名称: click 点击事件 事件处理程序:事件触发后要执行的代码(函数形式) 事件的基本使用  var box = docu ...

  5. jQuery的DOM操作详解

    DOM(Document Object Model-文档对象模型):一种与浏览器, 平台, 语言无关的规则, 使用该接口可以轻松地访问页面中所有的标准组件DOM操作的分类 核心-DOM: DOM Co ...

  6. Jqurey DOM 操作详解

    一.获取 1.获取内容----.text()  .html()   .value() text() - 设置或返回所选元素的文本内容                         格式:$(选择器) ...

  7. dom对象详解--document对象(三)

     form对象 form对象代表一个HTML表单,在HTML文档中<form>每出现一次,form对象就会被创建.从dom对象层次图看,document.forms对象是当前文档所有for ...

  8. DOM Ready 详解

    DOM Ready 概述 熟悉jQuery的人, 都知道DomReady事件. window.onload事件是在页面所有的资源都加载完毕后触发的. 如果页面上有大图片等资源响应缓慢, 会导致wind ...

  9. js学习--DOM操作详解大全 前奏(认识DOM)

    一 . 节点属性 DOM 是树型结构,相应的,可以通过一些节点属性来遍历节点树: 方法 说明 nodeName 节点名称,相当于tagName.属性节点返回属性名,文本节点返回#text.nodeNa ...

随机推荐

  1. JAVA基础知识之JVM-——通过反射查看类信息

    Class实例 当类被加载之后,JVM中就会生成一个Class实例,通过这个实例就可以访问JVM中的这个类.有三种方式可以获取Class对象 使用Class的静态方法forName(完整包名) 调用类 ...

  2. Java多线程的三种实现方式

    java多线程的三种实现方式 一.继承Thread类 二.实现Runnable接口 三.使用ExecutorService, Callable, Future 无论是通过继承Thread类还是实现Ru ...

  3. ISO C90 forbids mixed declarations and code 警告

    编译的时候经常会遇到   ISO C90 forbids mixed declarations and code 警告百度了一下,知道是如下原因 : 变量定义之前任何一条非变量定义的语句(注意:语句是 ...

  4. eclipse出现每次修改代码报heap over错误,然后必须重启tomcat问题,修改过程

    首先我在eclipse安装目录下找到eclipse.ini文件 修改了里边的参数 C:/Program Files/Java/jdk1.6.0_39/bin/javaw.exe--launcher.a ...

  5. Oracle-记录学习

    --select name,count(id) from work_test group by name having count(id)>1--select upper(name),t.*,l ...

  6. P2680 运输计划

    http://www.luogu.org/problem/show?pid=2680#sub 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航 ...

  7. BZOJ 3534 重建

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3534 题意:给定一个无向图,每条边有选择概率P:求选出的边恰是一棵生成树的概率. 思路: ...

  8. Sbt的使用初步和用sbt插件生成eclipse工程

    以前一直是用maven去管理java项目,现在开始写scala项目了但是在scala-ide中去编译scala项目和sbt的区别一直没弄清楚受到文章:http://my.oschina.net/yjw ...

  9. javascript权威指南笔记--javascript语言核心(二)

    1.函数作用域:在函数内声明的所有变量在函数体内始终是可见的.这意味着在变量声明之前甚至已经可用. *“声明提前”:javascript函数里声明的所有变量(但不涉及赋值)都被提前至函数的顶部. fu ...

  10. 关于HTML5与移动开发

    OSChina API列表: android api:http://tool.oschina.net/apidocs AppCan移动开发平台:http://doc.appcan.cn/#!/guid ...