您的位置:首页 > 其它

xml解析之dom解析

2017-12-11 13:11 169 查看
上节大概了解了xml,这节我们来对xml进行解析,前面说了,xml能保存数据和数据之间的结构,当我们用这些数据时,需要对他们进行解析,xml解析也是比较常见的一种业务需求,需要掌握

dom解析

1) dom解析    在内存中形成一个dom树
优点: dom树在内存中,速度快
缺点: 在解析大文档的时候,消耗大量内存

2)DOM解析XML文件步骤
创建解析器工厂对象
解析器工厂对象创建解析器对象
解析器对象指定XML文件创建Document对象
以Document对象为起点操作DOM树


这是案例中用到的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>

<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>

<book category="web">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>

<book category="web">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>

</bookstore>

package xml;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class DomParser {

public static void main(String[] args) throws Exception
{
// step 1:获得DOM解析器工厂
// 工厂的作用是创建具体的解析器
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

// step 2:获得具体的dom解析器
DocumentBuilder db = dbf.newDocumentBuilder();

// step 3:解析一个xml文档,获得Document对象(根节点)
// 此文档放在项目目录下即可
Document document = db.parse(new File("resource/Demo1.xml"));

// 根据标签名访问节点
NodeList list = document.getElementsByTagName("book");
System.out.println("list length: " + list.getLength());

// 遍历每一个节点
for (int i = 0; i < list.getLength(); ++i)
{
System.out.println("----------------------");
// 获得元素,将节点强制转换为元素
Element element = (Element) list.item(i);
// 此时element就是一个具体的元素

// 获取子元素:子元素title只有一个节点,之后通过getNodeValue方法获取节点的值
String content0 = element.getElementsByTagName("title").item(0)
.getNodeValue();

System.out.println(content0);// 此处打印出为null
// 因为节点getNodeValue的值永远为null

// 解决方法:加上getFirstChild()
String content = element.getElementsByTagName("title").item(0)
.getFirstChild().getNodeValue();
System.out.println("title: " + content);// 此处打印出书名

// 后面类似处理即可:
content = element.getElementsByTagName("author").item(0)
.getFirstChild().getNodeValue();
System.out.println("author: " + content);
content = element.getElementsByTagName("year").item(0)
.getFirstChild().getNodeValue();
System.out.println("year: " + content);
content = element.getElementsByTagName("price").item(0)
.getFirstChild().getNodeValue();
System.out.println("price: " + content);
}
}

}


第二个dom解析xml的例子

package xml;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Domparser2 {

/**
* 上一个例子是我从别人博客上copy下来的,博客地址我放在文末,有兴趣可以看看
* 这个例子我自己来,看能不能写出来吧,毕竟好久没用了。。。
* 唉,学而时习之。。。
* @param args
* @throws ParserConfigurationException
* @throws IOException
* @throws SAXException
*/
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {

//1.创建工厂
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//2.获取解析器
DocumentBuilder builder=factory.newDocumentBuilder();
//3.解析xml文档,获取文档模型
Document document=builder.parse(new File("resource/Demo1.xml"));
//4.执行操作
NodeList list=document.getElementsByTagName("book");
//5.遍历
/**
*     <book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
*/
System.out.println("有"+list.getLength()+"本书");
for (int i = 0; i < list.getLength(); i++) {
System.out.println("-------------------");
//6.获取每一个书节点
Node node=list.item(i);
//7.获取书节点的所有子节点
NodeList childlist=node.getChildNodes();
for (int j = 0; j < childlist.getLength(); j++) {
Node childNode =childlist.item(j);
String name=childNode.getNodeName();
//可以看到结果,不过这里有个问题,getnodeName貌似每次第一个得到的是#Text   很奇怪,先放着,完了回头看

String value=childNode.getTextContent();
System.out.println(name+":"+value);

}

}
}
}


代码中的第一个案例取自这个博客,如有侵权,联系修改
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息