要处理XML文档,就要先解析(parse)他,解析器时这样一个程序,读入一个文件,确认整个文件具有正确的格式,然后将其分解成各种元素,使得程序员能够访问这些元素,Java库提供了两种XML解析器:

  • 像文档对象模型(Document Object Model,DOM)解析器这样的树型解析器,他们将读入的XML文档转换成树结构
  • 像XML简单API(Simple API for XML,SAX)解析器这样的流机制解析器,他们读入XML文档时生成相应的事件

DOM解析器对于实现我们的大多数目的来说都更容易一些,如果需要处理很长的文档,用他来生成树结构会消耗大量的内存,或者只需要对于某些元素感兴趣,而不关心他们的上下文,那么可以考虑使用SAX解析器。DOM解析器的接口已经被W3C标准化了,org.w3c.dom包中包含了这些接口类型的定义,比如:Document、Element等,不同的实现者都编写了实现这些接口的DOM解析器,Java
XML
处理API(Java
API
for
XML
Processing,JAXP)库使得实际上可以以插件形式使用这些解析器中的任意一个。要读入一个XML文档,首先需要一个DocumentBuilder对象,可以从
DocumentBuilderFactory
中得到这个对象,代码如下:

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

DocumentBuilder builder=factory.newDocumentBuilder();

现在,可以从文件中读入某个文档:

 File f = …;

Document doc = builder.parse(f);

或者,可以用一个URL:

URL u = …;

Document doc = builder.parse(u);

甚至可以使用一个任意的输入流:

InputStream in = …;

Document doc = builder.parse(in);

Document 对象时XML文档的树型结构在内存的表现,他由实现了 Node 接口及其各子接口的类对象构成,子接口层次结构如下:

DOM
解析XML文档的代码示例如下:

  • XML文档内容:

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

    <root>

            <title>

                    <font enabled="false">

                            <!-- 字体名称 -->

                            <name>Helvetica</name>

                            <size>36</size>

                    </font>

                    <data>

                            <![CDATA[xml document root node <root.../>]]>

                    </data>

            </title>

    </root>

  • 解析代码:

    public static
    void
    main(String[] args) {

                    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

                    try {

                            DocumentBuilder builder = factory.newDocumentBuilder();

                            Path xmlPath = Paths.get("E:\\IDEA Workspace\\exampleiostream\\src\\main\\java\\org\\drsoft\\examples\\xml", "appParse.xml");

                            InputStream xmlStream = Files.newInputStream(xmlPath, StandardOpenOption.READ);

                            Document xmlDocument = builder.parse(xmlStream);

                            StringBuilder sb = new
    StringBuilder();

                            sb.append("<?xml version=\"" + xmlDocument.getXmlVersion() + "\"
    encodin=\""

    + xmlDocument.getXmlEncoding() + "\"
    ?>");

                            Element root = xmlDocument.getDocumentElement();

                            sb.append("<" + root.getTagName() + ">");

                            NodeList nodeList = root.getChildNodes();

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

                                    if (nodeList.item(i) instanceof Element) {

                                            sb.append(parseChildNodes((Element) nodeList.item(i)));

                                    }

                            }

                            sb.append("</" + root.getTagName() + ">");

                            System.out.println(sb.toString());

                    } catch (ParserConfigurationException e) {

                            e.printStackTrace();

                    } catch (IOException ex) {

                            ex.printStackTrace();

                    } catch (SAXException e) {

                            e.printStackTrace();

                    }

            }

     
     

            private static String parseChildNodes(Element element) {

                    StringBuilder sb = new
    StringBuilder();

                    sb.append("<" + element.getTagName());

                    NamedNodeMap map = element.getAttributes();

                    for (int j = 0; j < map.getLength(); j++) {

                            sb.append(" " + map.item(j).getNodeName() + "=\"" + map.item(j).getNodeValue() + "\"");

                    }

                    sb.append(" >");

                    if (element.hasChildNodes()) {

                            NodeList list = element.getChildNodes();

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

                                    if (list.item(i) instanceof Element) {

                                            Element curElement = (Element) list.item(i);

                                            sb.append(parseChildNodes(curElement));

                                            continue;

                                    }

                                    if (list.item(i) instanceof CDATASection) {

                                            CDATASection cdataSection = (CDATASection) list.item(i);

                                            sb.append("<![CDATA[").append(cdataSection.getData()).append("]]>");

                                            continue;

                                    }

                                    if (list.item(i) instanceof Comment) {

                                            Comment comment = (Comment)list.item(i);

                                            sb.append("<!-- "+comment.getData()+" -->");

                                            continue;

                                    }

                                    if (list.item(i) instanceof Text) {

                                            Text curText = (Text) list.item(i);

                                            sb.append(curText.getData().trim());

                                            continue;

                                    }

                            }

                    }

                    sb.append("</" + element.getTagName() + ">");

                    return sb.toString();

            }

     
     

笔记:XML-解析文档的更多相关文章

  1. XML之DOM解析文档 Day24

    TestDom.java package com.sxt.dom; import java.io.File; import java.io.IOException; import javax.xml. ...

  2. XML的文档声明

    1.XML的文档声明 <?xml version="1.0" encoding="utf-8"?> 文档声明必须写在第一行第一列 属性: versi ...

  3. 5月3日上课笔记-XML解析

    一.XML编程 1.xml编程的两种解析方式 1.1 dom解析 优点:一次加载,多次使用.可以方便的对xml文档进行增删改查 缺点:如果xml文档过大的话,加载的时候会比较占用内存空间比较大,消耗资 ...

  4. 文档ID:某某 模板文件不存在,无法解析文档!

    如果是生成栏目列表时出现这样的问题]:   1.可以修改include/arc.listview.class.php这个文件. 2.复制代码     echo "模板文件不存在,无法解析文档 ...

  5. DedeCMS模板文件不存在,无法解析文档! 问题定位方法

    生成静态的时候,经常会遇到“模板文件不存在,无法解析文 档!”的问题.很多朋友试过论坛里很多方法,都是针对某些人可以解决,某些人的问题依旧,为什么呢?其实问题很可能确实是多种多样的,表现结果却是一样, ...

  6. dedecms 模板文件不存在,无法解析文档"的终极各种解决办法

    方法一:[此对应喜欢把模板文件使用".html"的格式,]  /include/arc.archives.class.php 556行    if (!preg_match(&qu ...

  7. dedecms 模板文件不存在 无法解析文档!问题定位方法!

    生成静态的时候,经常会遇到“模板文件不存在,无法解析文 档!”的问题.很多朋友试过论坛里很多方法,都是针对某些人可以解决,某些人的问题依旧,为什么呢?其实问题很可能确实是多种多样的,表现结果却是一样, ...

  8. dedecms 模板文件不存在,无法解析文档的终极各种解决办法

    dedecms 模板文件不存在,无法解析文档"的终极各种解决办法 方法一:[此对应喜欢把模板文件使用".html"的格式,] /include/arc.archives. ...

  9. dom4j解析xml报"文档中根元素后面的标记格式必须正确"

    今天,在写个批量启动报盘机的自动化应用,为了简化起见,将配置信息存储在xml中,格式如下: <?xml version="1.0" encoding="UTF-8& ...

  10. JavaWeb学习笔记——XML解析

    DOM解析操作 只在跟节点<addresslist>下面建立一个子节点<name> <?xml version="1.0" encoding=&quo ...

随机推荐

  1. nginx重写rewrite的[emerg] unknown directive

    今天写nginx的重写规则.怎么写总是报这个错误.

  2. 程序bug致损失400亿,判程序员坐牢? 搞笑我们是认真的

    号外!号外!走过,路过,不要错过!日本 IT 业的狗血八卦继续独家放送啦!! 2015 年 9 月 3 日,随着东京最高法院驳回瑞穗证券的上诉,维持二审的原判结果,一个长达 10 年的诉讼终于画下了句 ...

  3. Linux开机启动图片修改

    Linux启动时会在屏幕上显示一个默认的开机图片,我们可以修改成为自己的图片,需要做以下工作 软件gimp下载地址:http://www.rayfile.com/zh-cn/files/0bb556b ...

  4. linux下mount/unmount命令

    格式:mount [-参数] [设备名称] [挂载点] 其中常用的参数有:-a 安装在/etc/fstab文件中类出的所有文件系统.-f 伪装mount,作出检查设备和目录的样子,但并不真正挂载文件系 ...

  5. RHEL部署ipa红帽身份验证

    1.先下载必须包 yum install -y ipa-server bind bind-dyndb-ldap 2.初始化ipa基本配置 ipa-server-install * Configure ...

  6. arttemplate与webpack的应用

    模板渲染使用arttemplate,使用方法如下: 普通使用 普通使用把渲染模板写在<script>标签里面,引入arttemplate.js,从服务端接收数据(数组与对象的形式),然后调 ...

  7. python爬虫--爬取某网站电影下载地址

    前言:因为自己还是python世界的一名小学生,还有很多路要走,所以本文以目的为向导,达到目的即可,对于那些我自己都没弄懂的原理,不做去做过多解释,以免误人子弟,大家可以网上搜索. 友情提示:本代码用 ...

  8. 非空校验的提示按钮(shiro项目中来的六)

    一:图示 二,js脚本 /** * jquery tips 提示插件 jquery.tips.js v0.1beta * * 使用方法 * $(selector).tips({ //selector ...

  9. httpclient的主要业务代码逻辑(图解)

    一,主要代码逻辑(图解) 二,两个案例的对比(图解) 三,详细案例 3.1,博文一 httppost的用法(NameValuePair(简单名称值对节点类型)核心对象) 3.2,博文二 httpcli ...

  10. GridView中添加行单击事件.md

    [toc] 1.使用说明 1.方法来源 该方法主要参考StackOverflow上面的答案和下面这篇文章 http://www.codeproject.com/Articles/15677/Click ...