用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(); }
}
|
还有一种解析xml文件的方式:
http://blog.chinaunix.net/u2/76927/showart_1813187.html
阅读(4262) | 评论(0) | 转发(0) |