Xml文档的解析

XML解析方式分为两种:DOM方式和SAX方式

DOM:Document Object Model,

文档对象模型。这种方式是W3C推荐的处理XML的一种方式。

SAX:Simple API for XML。

这种方式不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都支持它。

XML解析开发包:

JAXP:是SUN公司推出的解析标准实现。

Dom4J:是开源组织推出的解析开发包。(牛,大家都在用,包括SUN公司的一些技术的实现都在用)

JDom:是开源组织推出的解析开发包。

JAXP

JAXP:

JAXP:(Java API for XML Processing)开发包是JavaSE的一部分,它由以下几个包及其子包组成:

org.w3c.dom:提供DOM方式解析XML的标准接口

org.xml.sax:提供SAX方式解析XML的标准接口

javax.xml:提供了解析XML文档的类

javax.xml.parsers包中,定义了几个工厂类。我们可以通过调用这些工厂类,得到对XML文档进行解析的DOM和SAX解析器对象。

DocumentBuilderFactory

SAXParserFactory

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

如何获得JAXP中的DOM解析器?

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

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

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

Dom编程入门级别

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

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

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

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

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

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

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

Node对象总结

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

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

SAX解析过程:

查看老师的源代码即可

Sax 解析的过程

Dom4j解析xml文档:

Dom4j常用操作如下:

/**

* 返回Document

* @return

*/

public static Document getDocument(){

SAXReader reader;

Document document =null;

try {

reader = new SAXReader();

document = reader.read("src/book.xml");

} catch (Exception e) {

e.printStackTrace();

}

return document;

}

/**

* 写回Document到XML文件

* @param document

*/

public static void writeDocument2XML(Document document){

try {

OutputFormat format = OutputFormat.createPrettyPrint();

//format.setEncoding("UTF-8");

XMLWriter writer = new XMLWriter(new FileOutputStream("src/books.xml"), format);

writer.write(document);

writer.close();

} catch (Exception e) {

e.printStackTrace();

}

}

1、得到某个具体的节点内容  第二本书的作者

@Test

public void test1(){

//1.得到Document

Document document = Dom4jUtil.getDocument();

//2.得到根结点

Element root = document.getRootElement();

//3.第到第二本书  elments()  element()

List list = root.elements("书");

Element eleBook = (Element)list.get(1);

//4.找第二本书的作者

//Element authorEle = eleBook.element("作者");

Element authorEle = (Element)document.selectSingleNode("/书架/书[2]/作者");

//5.找作者所对应的文本

System.out.println(authorEle.getText());

}

2、遍历所有元素节点

@Test

public void test2(){

//1.得到Document

Document document = Dom4jUtil.getDocument();

//2.得到根结点

Element root = document.getRootElement();

// 递归调用

treeWalk(root);

}

public void treeWalk(Element element){

System.out.println(element.getName());

for(int i=0;i<element.nodeCount();i++){

Node node = element.node(i);

if(node instanceof Element){

treeWalk((Element)node);

}

}

}

3、修改某个元素节点的主体内容  修改第一本书的售价为300

//3、修改某个元素节点的主体内容  修改第一本书的售价为300

@Test

public void test3(){

//1.得到Document

Document document = Dom4jUtil.getDocument();

//2.得到根结点

Element root = document.getRootElement();

//3.找到第一本书

Element firstBookEle = root.element("书");

//4.找到第一本书的售价

//Element firstPriceEle = firstBookEle.element("售价");

//xpath

Element firstPriceEle= (Element)document.selectSingleNode("//书架/书[1]/售价");

//5.修改

firstPriceEle.setText("3000");

//6.写回

Dom4jUtil.writeDocument2XML(document);

}

4.向指定元素节点中增加子元素节点  在第二本书的售价后面添加一个批发价

@Test

public void test4(){

//1.得到Document

Document document = Dom4jUtil.getDocument();

//2.得到根结点

Element root = document.getRootElement();

//3.找到第二本书

List list = root.elements("书");

Element eleBook = (Element)list.get(1);

//4.追加一个批发价子结点

eleBook.addElement("批发价").setText("20000");

//6.写回

Dom4jUtil.writeDocument2XML(document);

}

5、向指定元素节点上增加同级元素节点  在第二本书售价前面添加一个内部价结点

@Test

public void test5(){

//1.得到Document

Document document = Dom4jUtil.getDocument();

//2.得到根结点

Element root = document.getRootElement();

//3.找到第二本书

List list = root.elements("书");

Element eleBook = (Element)list.get(1);

//4.添加内部价

Element innerPriceEle = DocumentHelper.createElement("内部价");

innerPriceEle.setText("40000");

eleBook.elements().add(2, innerPriceEle);//第三个位置上

//6.写回

Dom4jUtil.writeDocument2XML(document);

}

6、删除指定元素节点  删除第二本书的内部价

@Test

public void test6(){

//1.得到Document

Document document = Dom4jUtil.getDocument();

//2.得到根结点

Element root = document.getRootElement();

//3.找到第二本书

List list = root.elements("书");

Element eleBook = (Element)list.get(1);

//4.找到内部价

Element innerPriceEle = eleBook.element("内部价");

//5.删除  remove()删除指定结点

eleBook.remove(innerPriceEle);

//6.写回

Dom4jUtil.writeDocument2XML(document);

}

//7、操作XML文件属性  在第一本书结点中添加一个bid属性

@Test

public void test7(){

//1.得到Document

Document document = Dom4jUtil.getDocument();

//2.得到根结点

Element root = document.getRootElement();

//3.找到第一本书

Element firstBookEle = root.element("书");

//4.添加属性

firstBookEle.addAttribute("bid", "y11");

//6.写回

Dom4jUtil.writeDocument2XML(document);

}

Dom4j

是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。

Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。

使用Dom4j开发,需下载dom4j相应的jar文件。

Document对象

DOM4j中,获得Document对象的方式有三种:

1.读取XML文件,获得document对象

SAXReader reader = new SAXReader();

              Document   document = reader.read(new File("input.xml"));

2.解析XML形式的文本,得到document对象.

String text = "<members></members>";

              Document document = DocumentHelper.parseText(text);

3.主动创建document对象.

Document document = DocumentHelper.createDocument();

             //创建根节点

Element root = document.addElement("members");

节点对象

1.获取文档的根节点

Element root = document.getRootElement();

2.取得某个节点的子节点

Element element=node.element(“书名")

3.取得节点的文字

String text=node.getText();

4.取得某节点下所有名为“member”的子节点,并进行遍历.

List nodes = rootElm.elements("member");

  for (Iterator it = nodes.iterator(); it.hasNext();) {

     Element elm = (Element) it.next();

    // do something

 }

5.对某节点下的所有子节点进行遍历.

for(Iterator it=root.elementIterator();it.hasNext();){

       Element element = (Element) it.next();

       // do something

6.在某节点下添加子节点

Element ageElm = newMemberElm.addElement("age");

7.设置节点文字.

element.setText("29");

8.删除某节点.

parentElm.remove(childElm);

9.添加一个CDATA节点.

Element contentElm = infoElm.addElement("content");

contentElm.addCDATA(diary.getContent());

节点对象属性

1.取得某节点下的某属性

Attribute attribute=root.attribute("size");

2.取得属性的文字

String text=attribute.getText();

3.删除某属性

Attribute attribute=root.attribute("size");

 root.remove(attribute);

3.遍历某节点的所有属性

for(Iterator it=root.attributeIterator();it.hasNext();){

         Attribute attribute = (Attribute) it.next();

         String text=attribute.getText();

         System.out.println(text);

    }

4.设置某节点的属性和文字.

newMemberElm.addAttribute("name", "sitinspring");

5.设置属性的文字

Attribute attribute=root.attribute("name");

   attribute.setText("sitinspring");

将文档写入XML文件.

1.文档中全为英文,不设置编码,直接写入的形式.

  XMLWriter writer = new XMLWriter(new  FileWriter("output.xml"));

  writer.write(document);

  writer.close();

2.文档中含有中文,设置编码格式写入的形式.

OutputFormat format = OutputFormat.createPrettyPrint();

// 指定XML编码

format.setEncoding("GBK");       

XMLWriter writer = new XMLWriter(new FileOutputStream ("output.xml"),format);

writer.write(document);

writer.close();

字符串和xml文档之间的转换

1.将字符串转化为XML

String text = "<members> <member>sitinspring</member></members>";

Document document = DocumentHelper.parseText(text);

2.将文档或节点的XML转化为字符串.

SAXReader reader = new SAXReader();

Document   document = reader.read(new File("input.xml"));            

Element root=document.getRootElement();

String docXmlText=document.asXML();

String rootXmlText=root.asXML();

Element memberElm=root.element("member");

String memberXmlText=memberElm.asXML();

xml解析总结-常用需掌握的更多相关文章

  1. JAVA常用的XML解析方法

    转并总结自(java xml) JAVA常用的解析xml的方法有四种,分别是DOM,JAX,JDOM,DOM4j xml文件 <?xml version="1.0" enco ...

  2. IOS学习:常用第三方库(GDataXMLNode:xml解析库)

    IOS学习:常用第三方库(GDataXMLNode:xml解析库) 解析 XML 通常有两种方式,DOM 和 SAX: DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过 ...

  3. 【Android】实现XML解析的几种技术

    本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...

  4. xml解析模块

    XML XML是可扩展标记语言的缩写,是实现不同语言或程序之间进行数据交换的协议,主要可以对key添加属性. 页面做展示(字符类型的一个xml格式数据)\做配置文件(内部xml格式的数据).,每一个节 ...

  5. JAVA基础学习之XMLCDATA区、XML处理指令、XML约束概述、JavaBean、XML解析(8)

    1.CDATA区在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理.遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直 ...

  6. xml规范及xml解析

    http://www.cnblogs.com/wang-meng/p/5374498.html 1,XML基础介绍 xml的概念: XML 指可扩展标记语言(EXtensible Markup Lan ...

  7. Android实现XML解析技术

    转载:Android实现XML解析技术 本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为 ...

  8. 史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南-C++

    目录 史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南 流程设计 xml信息有哪几种读取形式(xml文件或wchar) 如何选取节点,and取节点属性有哪些方法? IXMLDOMNode与I ...

  9. JSON解析和XML解析对比

    JSON解析和XML解析是较为普遍的两种解析方式,其中JSON解析的市场分额更大.本文系统的分析两种解析方式的区别,为更好地处理数据作准备.由于目前阶段主要是做移动开发,所以本文所描述的JSON解析和 ...

随机推荐

  1. 转:【Java并发编程】之十六:深入Java内存模型——happen-before规则及其对DCL的分析(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17348313 happen-before规则介绍 Java语言中有一个"先行发生 ...

  2. oop 第三次作业 文件读写

    oop第三次作业 GitHub 对于迟交我感到很抱歉 031602510 体会 这次的用到了之前的文件读写,传参 定义函数有返回值,使代码更加简洁.面向对象的程序设计,在面对函数多元的情况下,编程更加 ...

  3. 201521123111《Java程序设计》第7周学习总结

    1. 本章学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 线性表,栈,队列,哈希表是常用的数据结构 在java.util包中有这些数据结构的实现类.比如:List接口,实现类Arra ...

  4. 201521123110 《Java程序设计》第9周学习总结

    1. 本周学习总结 2. 书面作业 1.常用异常 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 原来编写代码经常会出现数组访问 ...

  5. 201521123099 《Java程序设计》第13周学习总结

    本周学习总结 书面作业 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 1.2 telnet bbs. ...

  6. 猴子吃桃问题(南阳ACM324)

    猴子吃桃问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:0 描述 有一堆桃子不知数目,猴子第一天吃掉一半,又多吃了一个,第二天照此方法,吃掉剩下桃子的一半又多一个,天天如此, ...

  7. 初试 Vue.js

    1.为什么我会想要来弄弄vue这个前端框架呢? 答:前段时间被小程序刷屏了,然后就去弄了一下小程序,嗯挺简单的:头脑一发热后就想到vue2也发布一段时间了,何不也来尝尝vue2.0的味道,最后发现它们 ...

  8. 用户登陆注册【JDBC版】

    前言 在讲解Web开发模式的时候,曾经写过XML版的用户登陆注册案例!现在在原有的项目上,使用数据库版来完成用户的登陆注册!如果不了解的朋友,可以看看我Web开发模式的博文! 本来使用的是XML文件作 ...

  9. JavaScript配合button.onclick()使用总结

    Html加载顺序是从上往下加载,如果script中含有引用js脚本,则应该将此script放在head标签里面,这样可是保证此页面都可以引用js脚本内容.如果想在script中设置button.onc ...

  10. Python装饰器主要用法

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = '人生入戏' user = "admin" passwd = ...