关于Dom 对XML文件解析的感受和练习

      今天,学习了Web的基础框架,基本每个人框架都会有配置文件 **.xml文件,于是兴趣起来,就开始研究下java对XML文件的读取,把自己今天所练习和所得的感悟写下来。

      读了好多大佬写的博客和代码实现,于是自己也练习了下,总结点自己的知识。

      首先,xml文件是W3C创作的一种可扩展的标记语言,主要用于存数据和传输数据。

    解释下什么是可扩展性标签的语言?我一开始也很迷惑,所有想到很多朋友也会迷惑就说一下,标记性呢,就和HTML超文本语言一样,有自己的标签,什么是标签呢?<head></head> 这个就是一个标签。那可扩展性标签就是,你可以自己给这个标签定义名字。假如 我们有一个学生类 有 ID号 姓名 年龄,我们可以自己定义标签来解决他们。

<student>

  <id>AAA20141012</id>

  <name>张三</name>

  <age>22</age>

</student>

形式如同HTML超文本一样,就是名字换成你自己的标签了。

接下来要说的就是,Dom对XML文件的读取了。

Dom对XML文件的读取采用的是树的结构,对树的操作基本上玩的都是节点。

  首先要有一个工厂 DocumentBuilderFactory,由于这个工厂是抽象类,因此是实现了它的子类DocumentBuilderFactoryImpl但你会发现,你在开发的时候无法new这么一个对象出来,DocumentBuilderFactoryImpl这个实现类在 com.sun.org.apache.xerces.internal.jaxp 包下面确实存在,博主分析这个包应该是受保护的无法引入到程序中的。  类分两种编译时类和运行时类,既然在编译时不行,可以在运行时动手。可以根据反射机制,用DocumentBuilderFactory自定义的newInstance()得到一个新的实例,但这个实例本质上仍是DocumentBuilderFactoryImpl的对象。

   工厂建造完成后,只需要放入机器就可以工作了,DocumentBuider接口就像一个机器,DocumentBuider和DocumentBuilderFactory很像也是一个抽象类,但开发者并没有给它定义一个newInstance(),这台机器是由工厂自己产生的。在DocumentBuilderFactory中有一个newDocumentBuilder()方法来产生一个对象,这个实例本质上也是反射机制得到的DocumentBuiderImpl对象,DocumentBuiderImpl这个类也是存在com.sun.org.apache.xerces.internal.jaxp 包下面。

    接下来要有一个访问点就是Document,它表示了整个HTML文档或者是XML文档,是文档数的根,基本的访问点,在机器DocumentBuider中有四种方法来建立这个访问点。

   Document parse(String uri)  将指定文件URL的内容解析成XML文档,URL要解析内容的位置。

   Document parse(File f) 将指定文件的内容解析成XML文档。

   Document parse(InputStream is) 将给定InputStream的内容解析成为一个文档

   Document parse(InputStream is, String systemId) is - 包含要解析内容的 InputStream,systemId - 提供一个与解析器相关的URI的基础。

   根节点有了就可以根据树继续访问子节点了。

   关于节点我迷惑了好一会,在XML文件中

            <bookstore>
            <book id="1">
            <name>冰与火之歌</name>
            <author>乔治马丁</author>
            <year>2014</year>
            <price>89</price>
            </book>
            <book id="2">
            <name>安徒生童话</name>
            <year>2004</year>
            <price>77</price>
            <language>English</language>
            </book>
            <book id="3">
            <name>我一定会成功</name>
            <price>115</price>
            <author>tom</author>
            </book>

            </bookstore>

           对于document根节点,用document中的 getChildNodes() 得到的NodeList的getLength的长度是 1没有错就一个子节点<bookstore> 。但是到了第一个自定义标签即<bookstore>标签用getChildNodes()得到的NodeList的getLength的长度却是7。

         用这个节点(bookstore)的getFirstChild(),然后getNodeName()和getNodeValue()得到是#text和“”(里面什么也没有),于是一个一个的节点分析和取值,第二个是<book id="1">第三个是#text,一次一次往后推。于是能得到一个结论在<><>之间只要有字符就算一个节点。关于怎么取<book id="1">中的id可以用getAttributes()得到一个NamedNodeMap这个是个接口,实际上用的是com.sun.org.apache.xerces.internal.com.AttributeMap。然后通过映射item得到Node的属性。

剩下的方法照着JDK API玩就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值