您的位置:首页 > 编程语言 > Java开发

java解析xml文件

2009-08-23 21:47 323 查看
用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API (Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object Module)称为DOM。Sun公司提供了Java API for XML Parsing(JAXP)接口来使用SAX和DOM,通过JAXP,我们可以使用任何与JAXP兼容的XML解析器。
JAXP接口包含了三个包:
(1)org.w3c.dom W3C推荐的用于XML标准规划文档对象模型的接口。
(2)org.xml.sax  用于对XML进行语法分析的事件驱动的XML简单API(SAX)
(3)javax.xml.parsers解析器工厂工具,程序员获得并配置特殊的特殊语法分析器。
当然还有很多其他的解析xml的jar,只说sun提供的接口!
使用DOM解析XML文档
我们现在来看看DOM是如何解析XML的吧!同样的,我将从一个简单的不能再简单的例子来说明DOM是如何解析XML文档的,先让我们看看XML是什么内容吧:

<?xml version="1.0" encoding="UTF-8"?>
<books home="8242954" tel="13181805011" >
<book email="123@990.net">
<name id="1">java</name>
<price>102</price>
</book>
<book email="tian_bian_fei@163.com">
<name id="2">c++</name>
<price>100</price>
</book>
</books>

解析这个XML文件的Java代码 :

public static void main(String[] args) {
// TODO Auto-generated method stub

try {
/*
* DOM结点 DOM是一些节点的集合,由于文档中可能包含有不同类型的信息,所以定义了几种不同类型的节点。DOM中最常见的节点类型有:
* (1)元素: 元素是XML的基本构件。元素的子节点可以是其它元素、文本节点或两者都有。元素节点还可以只含有属性这一唯一类型的节点。
* (2)属性:属性节点包含关于元素节点的信息,但它不是元素的子节点 (3)文本:文本节点文本信息,或干脆是空白的文本。
* (4)文档:文档节点是整个文档中所有其它节点的父节点 元素是一种很重要的类型节点,元素节点可以是其他节点的容器。
*/

// 得到DOM解析器的工厂实例

DocumentBuilderFactory domfac = DocumentBuilderFactory
.newInstance();
// 从DOM工厂获得DOM解析器

DocumentBuilder dombuilder = domfac.newDocumentBuilder();
// 把要解析的XML文档转化为输入流,以便DOM解析器解析它

InputStream is = new FileInputStream("bin/java.xml");
// 解析XML文档的输入流,得到一个Document

Document doc = dombuilder.parse(is);
// 得到XML文档的根节点(books)

Element root = doc.getDocumentElement();
// 获得根节点的所有属性名和值

if (0 < root.getAttributes().getLength()) {
System.out.println("根节点属性信息..........");
for (int a = 0; a < root.getAttributes().getLength(); a++) {
System.out.println(root.getAttributes().item(a)
.getNodeName()
+ ":" + root.getAttributes().item(a).getNodeName());

}
}
// 得到根节点的子节点

NodeList books = root.getChildNodes();
for (int i = 0; i < books.getLength(); i++) {
Node book = books.item(i);
// 判断是不是子节点

if (book.getNodeType() == Node.ELEMENT_NODE) {
// 获得子节点的所有属性名和值

if (0 < book.getAttributes().getLength()) {
System.out.println("第" + i + "个子节点属性信息..........");
for (int b = 0; b < book.getAttributes().getLength(); b++) {
System.out.println(book.getAttributes().item(b)
.getNodeName()
+ ":"
+ book.getAttributes().item(b)
.getNodeValue());
}
}
//获得子节点的子节点

for (int j = 0; j < book.getChildNodes().getLength(); j++) {
Node book1 = book.getChildNodes().item(j);
//System.out.println(book.getChildNodes().item(j));

// 判断是不是子节点

if (book1.getNodeType()==Node.ELEMENT_NODE) {
// 获得子节点的所有属性名和值

if (0 < book1.getAttributes().getLength()) {
System.out.println(" 第" + i + "个子节点的第" + j
+ "子节点的属性信息..........");
for (int b1 = 0; b1 < book1.getAttributes()
.getLength(); b1++) {
System.out.println(book1.getAttributes()
.item(b1).getNodeName()
+ ":"
+ book1.getAttributes().item(b1)
.getNodeValue());
}
}
System.out.println(book1.getNodeName()+":"+book1.getFirstChild().getNodeValue());
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: