DOM解析XMl说白了其实就是用DOM把XML存储的数据转换成一棵树,通过节点以及节点之间的关系,把数据从XML文件中拿出来,为我所用,这样的一个过程,我们称之为“解析”。
一:XML与DOM
1:XML(eXtensible Markup Language)即可扩展标记语言,十一种简单的数据存储语言,使用一系列简单的标签描述数据,这些标签可以方便的建立。
◆特点:
独立于计算机平台,操作平台,编程语言来表示数据,以其简单性,可扩展性,交互性和灵活性在行业中获得广大的支持与采纳。
◆作用:
(1)数据存储:和数据库一样可以实现数据的持久化,但相比而言,数据的能力更强大一些,XML仅仅是极其简单的存储数据
(2)数据交换:在实际中,由于各种数据库的不同,那么他们之间的数据传递是一件让人头疼的事儿,可以使用XML的交换数据功能来解决这个问题。把数据库A的数据转换成标准的XMl文件,然后数据库B从XMl文件中解析数据,给自己使用。
(3)数据配置:使用XML文件作为配置文件,灵活性高,可读性强
2:DOM
DOM(Document Object Model)即文档对象模型。XML将数据组织成一棵树,所以DOM就是对这颗树的整体描述,那么对数据的各种操作,都可以通过这个DOM来完成。
二:解析过程
先来看一个基本的XML文件吧。
<?xml version="1.0" encoding="gbk"?> <bookstore> <book id="1"> <title tid="1">Harry Potter</title> <author>J K Rowling</author> <year>2005</year> <price>29.99</price> </book> <book id="2"> <title tid="2">Harry Potter</title> <author>J K Rowling</author> <year>2006</year> <price>39.99</price> </book> <book id="3"> <title tid="1">明朝那些事儿</title> <author>当年明月</author> <year>2009</year> <price>19.99</price> </book> </bookstore>
XML文件的主要组成部分为元素,如图中的book元素,title元素等。元素可以具有属性(如book的id),可以具有子元素(如book的title子元素),我们就是通过元素与元素之间的关系来达到获数据的目的。
再来看看XML在内存中的DOM结构吧。
可见bookstore标签在XML文件中是根标签,很显然在这颗树中他也是根元素,这个根元素还有book子元素,book子元素有属性值id,在book元素下面还有title,author,year,price四个子元素,在这些元素下面还有文本元素,即值。那么怎么取得文本元素中的值呢?下面就开始我们的解析之旅吧。。。
◆解析的过程分析:
简单的拿上面的XMl文件来说,文件中有三个book节点元素,所以应想办法获得这三个节点,然后循环遍历每一个book节点里面的内容。比如第一个book节点有一个属性值,所以应取得他的id属性值,然后下面还有四个子元素,分别先获得各个子元素,然后取得各个子元素的属性值(如果有的话),然后在取得各个子元素的文本子元素,在取得各个文本子元素的值。
总之,它的的遍历过程简单来说顺序如下:
根元素-->根元素属性-->根元素下的一级子元素-->根元素下的一级子元素的属性-->根元素下的一级子元素的文本子元素-->根元素下的一级子元素的文本子元素的值-->。。。。。。
◆解析之中用到的两个方法:
getElementsByTagName(元素节点名字):获得的是元素节点,如果它的下面还有子元素(或文本元素),那么由getFirstChild()取得
getAttributeNode(属性名字):用于取得属性,属性直接有值,所以用getNodeValue()取值
◆具体的解析过程:
1:得到DOM解析器的工厂实例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
2:从DOM工厂中得到DOM解析器
DocumentBuilder db = dbf.newDocumentBuilder();
3:解析XML文档,得到一个Document,即DOM树
Document doc = db.parse("e:/book.xml");
4: 得到所有节点的列表信息(因为有好多book)
NodeList petList = doc.getElementsByTagName("book");
5:轮循书本信息
for (int i = 0; i < petList.getLength(); i++) { // 得到book元素 Element book = (Element) petList.item(i); // 得到book元素下的id属性的值 String strId = book.getAttributeNode("id").getNodeValue(); // 得到book下的title子元素节点下的子文本节点的值 String strTitle = book.getElementsByTagName("title").item(0) .getFirstChild().getNodeValue(); // 得到book下的title子元素节点 Element title = (Element) book.getElementsByTagName("title") .item(0); // 得到title元素节点的tid属性节点的值 String strTid = title.getAttributeNode("tid").getNodeValue(); // 得到book元素节点的author属性节点的值 String strAuthor = book.getElementsByTagName("author").item(0) .getFirstChild().getNodeValue(); // 得到book元素节点的year属性节点的值 String strYear = book.getElementsByTagName("year").item(0) .getFirstChild().getNodeValue(); // 得到book元素节点的price属性节点的值 String strPrice = book.getElementsByTagName("price").item(0) .getFirstChild().getNodeValue(); System.out.println("ID:" + strId); System.out.println("标题:" + strTitle); System.out.println("标题ID:" + strTid); System.out.println("作者:" + strAuthor); System.out.println("出版日期:" + strYear); System.out.println("价格:" + strPrice); }
(友情提示:要抛出的异常)
结果:测试之前,在d盘上存一个book.xml文件
XML文件中book的初始化信息: ID:1 标题:Harry Potter 标题ID:1 作者:J K Rowling 出版日期:2005 价格:29.99 ID:2 标题:Harry Potter 标题ID:2 作者:J K Rowling 出版日期:2006 价格:39.99 ID:3 标题:明朝那些事儿 标题ID:1 作者:当年明月 出版日期:2009 价格:19.99
DOM的文档解析先说到这里,我得去做编个代码。。。白咯
原文链接:https://www.f2er.com/xml/300077.html