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();

转载于:https://www.cnblogs.com/thankyou/p/4352093.html

xml解析总结-常用需掌握相关推荐

  1. 关于XML解析的常用方式

    关于XML解析的方式(个人喜爱的方式,有些不常用的就不写了) 需要的jar包 dom4j / jaxen XML示例(该文件放置于src目录下) <?xml version="1.0& ...

  2. java 解析/操作 xml 几种常用方式 xml的增加/删除/修改

    java 解析/操作 xml 几种常用方式 xml的增加/删除/修改 首先,我们先介绍几种常用的xml解析器. 1. 介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方 ...

  3. JAVA常用的XML解析方法

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

  4. 常用 XML 解析技术

    现在的软件项目都不是独立的一个项目,都是多系统协调工作.这样的话就涉及到系统间的通讯,通讯就会跟报文传输挂上关系.系统间使用怎样的报文格式进行通讯呢?有的使用固定长度格式报文:有的使用变长格式报文:有 ...

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

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

  6. Xml解析常用的两种方式

    Xml解析常用的两种方式 Xml解析常用的两种方式dom. DOM4J 下面我们先看一下这两种方式的优缺点: 1.DOM解析的特点是将整个xml文档以树形结构放入到内存中,是官方推荐标准,优点是在内存 ...

  7. 什么是xml解析?xml解析的有几种常用的解析方式?

    xml解析概述 XML解析主要为两种:DOM和SAX解析 DOM:文档对象模型,这种方式是W3C推荐的处理XML的一种方式 SAX解析不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都 ...

  8. python解析xml文件选用模块_python语言解析xml文件的常用的有两种方式

    MiniDom方式解析xml xml文件以data.xml为例,具体操作如下: data.xml: 保存用户的信息 Jordy 12345678 20 男 上网 功夫 34443678 18 男 功夫 ...

  9. XML解析方式(来自 传智播客 方立勋视频教程)

    为什么80%的码农都做不了架构师?>>>    XML解析方式一般有两种:DOM和SAX DOM:(Document Object Model,即文档对象模型)是W3C组织推荐的解析 ...

最新文章

  1. VS2019调试查看变量_PL/SQL调试存储过程?看这篇就够了
  2. idea改成c盘_解决IDEA占用C盘空间过大的问题
  3. java hadoop api_Hadoop 系列HDFS的Java API( Java API介绍)
  4. 修改tomcat端口号、编码
  5. Hibernate的出现和Hinbernate的简单模拟实现
  6. 排查 CI Unable to load the requested file
  7. 【笔记】线性代数的本质
  8. 第三百一十八节,Django框架,信号
  9. 老男孩linux培训某节课前考试试题及答案分享 【转】
  10. Spring RestTemplate 实践
  11. Python压缩、减压7z文件
  12. spring中AutoWired/Quafifier/Primary及相关注解知识
  13. Picture of my baby when 2 monthes old_拔剑-浆糊的传说_新浪博客
  14. 如何在网页中嵌入网易云音乐
  15. iSlide(PPT插件)
  16. hp-ux系统备份与恢复常用命令
  17. 右上角的引用文献格式_论文要引用的小符号右上角怎么打?
  18. 人脸识别系列(六):FaceNet
  19. Redis底层数据结构详解(一)
  20. ip_forward与路由转发

热门文章

  1. 本田和丰田,你选那个?
  2. 公司行政的未来在哪里?要不要转行?
  3. 赚钱只要找到方法,就如吸空气
  4. 电视如果使用独立显卡会怎么样?
  5. 手机运行内存6+128跟8+128有什么区别?
  6. Qt——P11 自定义的信号和槽发生重载的解决
  7. Zookeeper节点详解
  8. Ajax+Input的File控件上传时的超级简单实时进度条
  9. 在SQL数据库中搜索对象的不同方法
  10. 使用系统视图发现SQL Server实例信息