关闭

jaxp解析器用dom方式操作xml文档的总结

标签: domxml解析jaxp解析器
334人阅读 评论(0) 收藏 举报
分类:

1. xml解析技术概述

  
  解析xml文档一般有两种技术:dom(Document Object Model)和sax(Simple API for XML)。dom即文档对象模型,是W3C组织推荐的处理xml的一种方式;sax不是官方标准,但它是xml社区事实上的标准,几乎所有的xml解析器都支持它。

1.1 dom方式

  dom方式会把文本解析成Document对象,把所有元素和文本也解析成一个对象:解析器将标签解析为Element对象,对内容解析为Text对象,对属性解析为Attribute。对所有的节点都可以用Node对象表示,当没有合适的方法调用的时候,才把Node强制转换成上面的具体类型,上面的类都是Node的子类。 
  使用dom方式对xml文档解析只需要得到document对象,就可以得到所有节点,因为在内存中会解析成树结构图。

  • 优点:实现CURD特别方便,操作速度也比较快。
  • 缺点:如果文件比较大,对内存消耗就特别大,极易导致内存溢出,所以dom方式不是和操作大的xml文档。

1.2 sax方式

  sax方式不是先将文本解析成整个对象,它是读取一行解析一行。

  • 优点:解析速度快,对内存占用少,查找数据特别方便。
  • 缺点:只适合查找数据,不适合CURD操作。

  针对这两种方式,有很多解析开发包,主要有jaxp和dom4j,这篇文章先介绍一下jaxp解析器如何用dom方式解析xml文档。 

2. jaxp解析器用dom方式解析xml文档

  
  jaxp开发包是j2se的一部分,它由javax.xmlorg.w3c.domorg.xml.sax包及其子包组成。在javax.xml.parsers包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的dom和sax的解析器对象。javax.xml.parsers包中的DocumentBuilderFactory用于创建dom模式的解析器对象,DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但是该类提供了一个静态的newInstance()方法,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。 

  首先给出个book.xml文档,如下:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore> 
  <book name="book1" password="123"> 
    <price>59元</price>  
    <name>java神书1^^</name>  
    <author>倪升武</author>  
  </book> 
  <book name="book2" password="123456"> 
    <price>69元</price>  
    <name>java神书2^^</name>  
    <author>倪升武</author>  
  </book> 
</bookstore>

  下面我们来使用jaxp具体解析这个book.xml文档:

2.1 得到节点的值

@Test
public void read() throws Exception{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//获取工厂
    DocumentBuilder builder = factory.newDocumentBuilder();//产生解析器
    Document document = builder.parse(new File("src/book.xml"));//解析xml文档,得到代表文档的document

    NodeList list = document.getElementsByTagName("price");//返回所有price节点的集合
    Node price = list.item(0); //拿到第一个price节点
    String value = price.getTextContent();//获取节点的值
    System.out.println(value); //59元    
}

2.2 修改节点的值

@Test
public void update() throws Exception{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(new File("src/book.xml"));

    Node price = document.getElementsByTagName("售价").item(0);
    price.setTextContent("89元");
    /*javax.xml.tranform包中的Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出。
     *例如把XML文件应用样式表后转成一个HTML文档,利用这个对象,当然也可以把Document对象重新写入到一个XML文件中。
     *Transformer类通过transform(Source xmlSource, Result outputTarget)方法完成转换操作,该方法接受一个源和一个目的地。我们可以通过:
     *      javax.xml.transform.dom.DOMSource类来关联要转换的document对象,
     *      用javax.xml.transform.stream.StreamResult对象来表示数据的目的地。
     *Transformer抽象类,但是其对象通过TransformerFactory.newTransformer获得。
     *
    */

    //得到转换器工厂
    TransformerFactory tf = TransformerFactory.newInstance();
    //得到转换器
    Transformer ts = tf.newTransformer();   
    ts.transform(new DOMSource(document), new StreamResult(new File("src/book.xml"))); //将修改后的document对象(dom)转换到book.xml
}

2.3 添加新的节点

@Test
public void addNode() throws Exception{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(new File("src/book.xml"));

    //创建需要增加的节点
    Node price = document.createElement("price");
    price.setTextContent("109元");

    //得到需要增加的节点的父节点
    Node parent = document.getElementsByTagName("book").item(0);//第一个book节点

    //把需要增加的节点挂到父节点上
    parent.appendChild(price);

    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer ts = tf.newTransformer();
    ts.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")));
}

2.4 向指定位置添加新的节点

@Test
public void addNodeWithIndex() throws Exception {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(new File("src/book.xml"));

    Node node = document.createElement("price");
    node.setTextContent("39元");
    Node parent = document.getElementsByTagName("book").item(0);
    parent.insertBefore(node, document.getElementsByTagName("name").item(0));//在书名前添加node

    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer ts = tf.newTransformer();
    ts.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")));
}

2.5 删除指定的节点

@Test
public void delete() throws Exception{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(new File("src/book.xml"));

    NodeList nodes = document.getElementsByTagName("price");//获取所有售价节点
    for(int i = 0; i <= nodes.getLength(); i++){
        if(nodes.item(i).getTextContent().equals("109元")){
            //自己不能删自己,要让它的父节点来删
            nodes.item(i).getParentNode().removeChild(nodes.item(i));//删除所有售价为109元的节点
        }
    }

    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer ts = tf.newTransformer();
    ts.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")));
}

2.6 操作文档的属性

@Test
public void updateAttribute() throws Exception{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(new File("src/book.xml"));

    //操作XML文档元素时,一般都把元素当做Node对待,但是如果Node没有合适的方法时,就得转换成相应的类型
    Node node = document.getElementsByTagName("book").item(0);
    Element book = null;
    if(node.getNodeType() == Node.ELEMENT_NODE)//在转换之前,最好先判断下类型
        book = (Element)node;
    book.setAttribute("name", "--book--");
    book.setAttribute("password", "--123--");

    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer ts = tf.newTransformer();
    ts.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")));
}

  以上就是jaxp解析器使用dom方式对xml文档进行解析的总结,可以看出,如果只读不写,只要获取解析器工厂–>获取解析器–>将xml转换成document,然后开始获取想要获取的数据。如果要向xml文档中写数据,那么要获取转换器工厂–>获取转换器–>将document转换成xml。所以很明显,这是两个相反的过程。

原文链接:http://blog.csdn.net/eson_15/article/details/51509618

2
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

jaxp解析器用dom方式操作xml文档的总结

1. xml解析技术概述  解析xml文档一般有两种技术:dom(Document Object Model)和sax(Simple API for XML)。dom即文档对象模型,是W3C组织推荐的...
  • eson_15
  • eson_15
  • 2016-05-26 18:48
  • 2555

dom解析方式对xml文档进行操作

java就业培训教程 张孝祥 36.2元 javascript就业培训教程 张孝祥 ...
  • qq_30638831
  • qq_30638831
  • 2016-04-07 14:45
  • 653

利用JAXP和DOM4J解析XML

解析XML主要有两种思想,一种是SAX(Simple API for XML),另一种是DOM(文档对象模型),其中在J2EE中,提供了JAXP来实现这两种解析,本文主要利用JAXP实现SAX解析,同...
  • maxwell_nc
  • maxwell_nc
  • 2015-05-09 10:19
  • 1194

XML解析的两种方式:DOM方式和SAX方式

DOM:Document ObjectModel,文档对象模型。这种方式是W3C推荐的处理XML的一种方式。 SAX:Simple API for XML。这种方式不是官方标准,属于开源社区XML-D...
  • u012526194
  • u012526194
  • 2015-09-26 14:17
  • 3353

xml的jaxp解析(对xml添加,删除,修改,遍历等操作)

1.在js使用dom解析标记型文档,根据html的层级结构,在内存中分配一个树形结构,把html 的标签属性和文本都封装成对象,document对象,element对象,属性对象,文本对象,node节...
  • zhulin0519
  • zhulin0519
  • 2015-11-22 18:02
  • 319

XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?

有两种定义形式,dtd文档类型定义和SchemaXML模式; XML Schema 和DTD都用于文档验证,但二者还有一定的区别,本质区别是:Scheme本身是xml的,可以被XML解析器解析,这也...
  • happymatilian
  • happymatilian
  • 2015-06-09 17:48
  • 1580

使用DOM解析XML文件

首先写了一个xml文件 c# 张三 1990 60 JAVA 李四 1991 80 Dom解析xml文件 pa...
  • qq_27376871
  • qq_27376871
  • 2016-08-08 11:18
  • 738

浅析SAX,DOM,JAXP,JDOM与DOM4J之间的关系

众所周知,SAX与DOM是JAVA中两大核心XML解析API类库,今日兴起看了看相关资料,在这里总结总结。   首先登场的是SAX,SAX是Simple API for XML的简称。另外SAX只...
  • xiongqi215
  • xiongqi215
  • 2013-08-21 23:10
  • 2349

使用DOM解析XML文件

XML是一种可扩展的标记语言,首先它是一种标记语言,类似于HTML,有标签,标签有属性,然而与HTML不同的是XML的标签是可以自己定义的,这样就方便我们存储一些有层次结构的内容! 这里要说的是使用D...
  • zhuxinquan61
  • zhuxinquan61
  • 2016-01-21 20:55
  • 823

JavaEE实战——XML文档DOM、SAX、STAX解析方式详解

本文主要介绍XML文档作为存储和传输数据的三种解析方式,其各自主要的思想、实现方式、CURD实现,以及最后展示一个综合的实战例子加以巩固理解。
  • zhongkelee
  • zhongkelee
  • 2016-06-22 23:10
  • 2230
    个人资料
    • 访问:295365次
    • 积分:3913
    • 等级:
    • 排名:第9425名
    • 原创:73篇
    • 转载:193篇
    • 译文:0篇
    • 评论:17条
    最新评论