文档章节

JavaWeb学习日记----XML的解析

o
 osc_gu9d45li
发布于 2019/04/05 22:36
字数 1241
阅读 22
收藏 0

精选30+云产品,助力企业轻松上云!>>>

XML的解析简介:

  在学习JavaScript时,我们用的DOM来解析HEML文档,根据HTML的层级结构在内存中分配一个树形结构,把HTML的标签啊,属性啊和文本之类的都封装成对象。

  比如:document对象,element对象,属性对象,文本对象,Node结点对象

我们通常有两种方式来解析XML:DOM和SAX

  DOM解析方式:

    其实跟HTML差不多的,也是根据XML的层级结构在内存中分配一个树形结构,把XML的标签,属性和文本都封装成对象。

    缺点:如果文件过大的话,就和造成内存溢出。

    优点:可以很方便实现增删改操作。

  SAX解析方式:

    采用事件驱动,从上到下,一行一行的解析,边读边解析。解析到某一个对象时,返回对象名称。

    缺点:不能实现增删改操作

    优点:不会内存溢出,可以方便实现查询操作。

解析器:

  在解析XML时,需要解析器。针对DOM和SAX,不同的公司和组织向我们提供了不同的解析器。

  SUN公司:      jaxp

  dom4j组织:    dom4j 

  jdom组织 :     jdom

  在实际开发中,dom4j用的最多

jaxp:

  jaxp解析器在JDK的javax.xml.parsers包里面。针对dom和sax分别提供了解析器:

    dom:  DocumentBuilder:  解析器类

        DocumentBuilderFactory:  解析器工厂类

    sax:  SAXParser:  解析器类

        SAXParserFactory:  解析器工厂类

那么我们具体获得JAXP中的DOM解析器的方法如下:

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

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

  调用解析器对象的parse()方法解析XML文档,该方法的参数为XML文档的URL或者封装了XML路径的文件对象。即:parse(String uri)  parse(File f)

  示例:

     // 创建解析器工厂
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        // 获得解析器
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        // 解析目标XML文件
        Document document = documentBuilder.parse("src/OnePiece.xml");

通过上述步骤我们就能得到代表整个文档的Document对象,就可以利用DOM特性对整个XML文档进行操纵了。

  Document接口中常用的方法:

  

 NodeList getElementsByTagName(String tagname)     按文档顺序返回包含在文档中且具有给定标记名称的所Element的 NodeList。 
 Element createElement(String tagName)          创建指定类型的元素。     
 Text createTextNode(String data)              创建给定指定字符串的 Text 节点。 

  Document的父接口Node中常用的方法:

Node appendChild(Node newChild) 
          将节点 newChild 添加到此节点的子节点列表的末尾。 
Node removeChild(Node oldChild) 
          从子节点列表中移除 oldChild 所指示的子节点,并将其返回。 
 Node getParentNode() 
          此节点的父节点。
String getTextContent() 
          此属性返回此节点及其后代的文本内容。 
void setTextContent(String textContent) 
          此属性返回此节点及其后代的文本内容。 

  在得到的NodeList集合中有下列方法可以实现遍历:

int getLength() 
          列表中的节点数。 
 Node item(int index) 
          返回集合中的第 index 个项。 

 在对Document对象进行更新操作时,都是在内存中进行的。如果想要更直观地显示在XML文档中,需要进行回写操作。即:把Document对象又重新写入到XML文件中。

示例:

现有一个XML文档内容如下:

 

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<海贼王>
    <草帽海贼团>
        <船长>路飞</船长>
        <厨师>山治</厨师>
        <航海士>娜美</航海士>
        <船医>乔巴</船医>
        <音乐家>贝多芬</音乐家>
        
    </草帽海贼团>
    <草帽海贼团>
        <副船长>索隆</副船长>
        <考古学家>罗宾</考古学家>
        <狙击手>乌索普</狙击手>
        <船工>弗兰奇</船工>
    </草帽海贼团>
</海贼王>

 

 

 

需求:将第一个<草帽海贼团>下面的<音乐家>内容贝多芬改为布鲁克

代码如下:

package com.alex;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/*
 * 将第一个<草帽海贼团>下面的<音乐家>内容贝多芬改为布鲁克
 */
public class OnePieceTest3 {
    public static void main(String[] args) throws Exception {
        // 创建解析器
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        // 解析目标XML文件
        Document document = documentBuilder.parse("src/OnePiece.xml");

        // 获得目标元素集合
        NodeList list = document.getElementsByTagName("草帽海贼团");

        Node node = list.item(0);
        NodeList childNodes = node.getChildNodes();
        for (int j = 0; j < childNodes.getLength(); j++) {
            Node node2 = childNodes.item(j);
            String nodeName = node2.getNodeName();
            if (nodeName.equals("音乐家"))
                node2.setTextContent("布鲁克");
        }
        // 回写
        // 创建转换器
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.transform(new DOMSource(document), new StreamResult("src/OnePiece.xml"));
    }
}

 修改后XML文档内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<海贼王>
    <草帽海贼团>
        <船长>路飞</船长>
        <厨师>山治</厨师>
        <航海士>娜美</航海士>
        <船医>乔巴</船医>
        <音乐家>布鲁克</音乐家>
    </草帽海贼团>
    <草帽海贼团>
        <副船长>索隆</副船长>
        <考古学家>罗宾</考古学家>
        <狙击手>乌索普</狙击手>
        <船工>弗兰奇</船工>
    </草帽海贼团>
</海贼王>

 

2019-04-05

   

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

物联网开发服务开发虚拟设备需要几步?

云栖号快速入门:【点击查看更多云产品快速入门】 不知道怎么入门?这里分分钟解决新手入门等基础问题,可快速完成产品配置操作! 物联网平台设备的正常开发流程是:设备端开发完成,设备上报...

osc_2axit9df
21分钟前
18
0
互联网互联网必看文章墙裂推荐

后端必看文章系列 大型项目架构演进过程及思考的点

code-ortaerc
21分钟前
14
0
ACL2020论文整理 - 知乎

ACL2020录取文章已经放出,链接如下: ACL2020论文集合 www.aclweb.org 为了以后更加方便地阅读论文,也本着一颗开源之心,花一个下午的时间整理了一下相关论文。鉴于本人精力有限,并且也只...

osc_5w65ebjo
22分钟前
7
0
SU(N) Hubbard 模型平均场

osc_31d5oo2i
24分钟前
18
0
Python语言及其应用PDF高清完整版百度云盘免费下载|python基础教程PDF电子书推荐

编辑推荐 本书内容易于理解,而且读起来生动有趣,是编程和Python初学者不可多得的教程。书中首先介绍了Python的基础知识,然后逐渐深入多种主题,结合教程和攻略式风格来讲解Python 3中的概...

osc_nbg2lo7i
25分钟前
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部