以 DOM 方式解析XML文档,示例如下(标有详细注释)
package Test_DOM;
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.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class Test {
public static void main(String[] args) throws ParserConfigurationException,
SAXException, IOException {
DocumentBuilderFactory builderFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
/*
* builder.parse()方法将给定文件的内容解析为一个 XML 文档, 并且返回一个新的 DOM Document对象。
*/
Document document = builder.parse(new File("books.xml"));
//打印document节点
printNode(document,0);
//获取文档的根元素,赋值给rootElement变量
Element rootElement = document.getDocumentElement();
//获取元素的count属性
int countOfBooks = Integer.parseInt(rootElement.getAttribute("count"));
System.out.println("There are "+countOfBooks+" books , they are ");
//获取rootElement的所有子节点(不包括属性节点),返回一个NodeList对象
NodeList childNodes = rootElement.getChildNodes();
for(int i = 0;i < childNodes.getLength();i++){
//获取childNodes的第i个节点
Node childNode = childNodes.item(i);
//判断childNode是不是一个元素节点,并且它的 nodeName 值为book
if(childNode.getNodeType() == Node.ELEMENT_NODE
&& childNode.getNodeName().equals("book")){
//若是,则获取childNode的所有子节点(不包括属性节点),返回一个NodeList对象
NodeList childNodes_2 = childNode.getChildNodes();
for(int j = 0;j < childNodes_2.getLength();j++){
//获取childNodes_2的第j个节点
Node childNode_2 = childNodes_2.item(j);
//判断childNode_2是不是一个元素节点,并且它的 nodeName 值为name
if(childNode_2.getNodeType() == Node.ELEMENT_NODE
&& childNode_2.getNodeName().equals("name")){
//若是,则获取childNode_2的所有子节点(不包括属性节点),返回一个NodeList对象
NodeList childNodes_3 = childNode_2.getChildNodes();
for(int k = 0;k < childNodes_3.getLength();k++){
//获取childNodes_3的第k个节点
Node childNode_3 = childNodes_3.item(k);
//判断childNodes_3是不是一个文本节点
if(childNode_3.getNodeType() == Node.TEXT_NODE){
//若是,则打印输出这个文本节点的nodeValue
System.out.println(" <<"+childNode_3.getNodeValue()+">>");
}
}
}
}
}
}
}
/*
* 打印 DOM 节点
* 输出格式为:
* nodeType(nodeName,nodeValue)
* "ATTRIBUTE"(attributeName=attributeValue)
* ...
* childNodeType[childNodeName,childNodeValue]
* ...
*/
public static void printNode(Node node,int count) {
if (node != null) {
String tmp = "";
for(int i = 0 ; i < count ; i++) tmp += " ";
//获取node节点的节点类型,赋值给nodeType变量
int nodeType = node.getNodeType();
switch (nodeType) {
case Node.ATTRIBUTE_NODE: tmp += "ATTRIBUTE";break;
case Node.CDATA_SECTION_NODE: tmp += "CDATA_SECTION";break;
case Node.COMMENT_NODE:tmp += "COMMENT";break;
case Node.DOCUMENT_FRAGMENT_NODE:tmp += "DOCUMENT_FRAGMENT";break;
case Node.DOCUMENT_NODE:tmp += "DOCUMENT";break;
case Node.DOCUMENT_TYPE_NODE:tmp += "DOCUMENT_TYPE";break;
case Node.ELEMENT_NODE:tmp += "ELEMENT";break;
case Node.ENTITY_NODE:tmp += "ENTITY";break;
case Node.ENTITY_REFERENCE_NODE:tmp += "ENTITY_REFERENCE";break;
case Node.NOTATION_NODE:tmp += "NOTATION";break;
case Node.PROCESSING_INSTRUCTION_NODE:tmp += "PROCESSING_INSTRUCTION";break;
case Node.TEXT_NODE:tmp += "TEXT";break;
default:return;//invalid node type.
}
System.out.println(tmp+" ("+node.getNodeName()+","+node.getNodeValue()+")");
/*
* node.getAttributes()方法返回
* 包含node节点的属性的 NamedNodeMap(如果它是 Element)
*/
NamedNodeMap attrs = node.getAttributes();
if(attrs != null)
for(int i = 0 ; i < attrs.getLength() ; i++){
printNode(attrs.item(i),count+1);
}
/*
* node.getChildNodes()方法返回
* 包含node节点的所有子节点的 NodeList。
*/
NodeList childNodes = node.getChildNodes();
for(int i = 0 ; i < childNodes.getLength() ; i++){
printNode(childNodes.item(i),count+1);
}
}
}
}
books.xml 的内容如下:
<?xml version="1.0" encoding="GB2312"?>
<books count="3"
xmlns="http://test.org/books">
<!--books's comment-->
<book id="1">
<name>Thinking in JAVA</name>
</book>
<book id="2">
<name>Core JAVA2</name>
</book>
<book id="3">
<name>C++ primer</name>
</book>
</books>
运行结果如下:
DOCUMENT (#document,null)
ELEMENT (books,null)
ATTRIBUTE (count,3)
TEXT (#text,3)
ATTRIBUTE (xmlns,http://test.org/books)
TEXT (#text,http://test.org/books)
TEXT (#text,
)
COMMENT (#comment,books's comment)
TEXT (#text,
)
ELEMENT (book,null)
ATTRIBUTE (id,1)
TEXT (#text,1)
TEXT (#text,
)
ELEMENT (name,null)
TEXT (#text,Thinking in JAVA)
TEXT (#text,
)
TEXT (#text,
)
ELEMENT (book,null)
ATTRIBUTE (id,2)
TEXT (#text,2)
TEXT (#text,
)
ELEMENT (name,null)
TEXT (#text,Core JAVA2)
TEXT (#text,
)
TEXT (#text,
)
ELEMENT (book,null)
ATTRIBUTE (id,3)
TEXT (#text,3)
TEXT (#text,
)
ELEMENT (name,null)
TEXT (#text,C++ primer)
TEXT (#text,
)
TEXT (#text,
)
There are 3 books , they are
<<Thinking in JAVA>>
<<Core JAVA2>>
<<C++ primer>>
分享到:
相关推荐
### DOM4J解析XML详解 #### 一、DOM4J简介与特性 DOM4J是一个由dom4j.org开发的开源XML解析包,专为Java平台设计,它不仅支持DOM、SAX和JAXP标准,还巧妙地融入了Java集合框架,使其成为Java开发者在处理XML数据时...
Java DOM4J解析XML详解 XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件和文档存储等领域。DOM4J是Java中一个强大的、轻量级的处理XML的库,它提供了丰富的API来读取、...
DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了简单而灵活的API,使得在Java应用程序中读取、写入、修改以及查询...提供的源代码和解析XML详解文档将有助于进一步理解DOM4J的工作机制,并提升实际开发能力。
**DOM4J——XML解析库详解** XML(eXtensible Markup Language)作为一种标记语言,广泛应用于数据交换、配置文件和文档存储等领域。在Java环境中,解析XML文档时,我们通常会遇到各种库,其中DOM4J是一个非常流行...
java中四种操作(dom、sax、jdom、dom4j)xml方式详解与
### Dom4j遍历解析XML知识点详解 #### 一、Dom4j简介及环境搭建 Dom4j(Document Object Model for Java)是一个Java语言的开源XML API,它提供了非常便捷的方式来解析、创建以及操作XML文档。相较于其他XML解析库...
**DOM4J解析XML实例详解** 在Java编程中,处理XML文档是一项常见的任务。DOM4J是一个非常流行的、强大的Java XML API,它提供了灵活且高效的方式来解析、创建、修改XML文档。本文将深入探讨如何使用DOM4J进行XML...
### DOM4J解析XML详解 #### 一、DOM4J简介 DOM4J是一个由dom4j.org组织提供的开源XML解析工具包,专为Java平台设计。它支持DOM(Document Object Model)、SAX(Simple API for XML)以及JAXP(Java API for XML ...
JAVA DOM 解析 XML 文件过程详解 JAVA DOM 解析 XML 文件过程详解是指使用 JAVA 语言通过 DOM(Document Object Model)解析 XML 文件的过程。DOM 是一种应用程序接口(API),它将 XML 文档转换为一个树形结构,...
### XML解析技术DOM4J解析 #### DOM4J解析概览 DOM4J是一种高性能、功能强大且极其易于使用的Java XML API,它最初是作为JDOM的一个智能分支发展起来的,自2000年下半年开始持续开发。DOM4J不仅在功能上超越了基本...
### DOM4J解析XML知识点详解 #### 一、DOM4J简介 DOM4J是一个Java库,用于处理XML文档。它的设计目标是为了提供一个简单、易于使用的API来处理XML文件,同时保持性能上的优势。与Java标准库中的DOM实现相比,DOM4J...
DOM方式解析XML是一种内存密集型的操作方式,因为它需要将整个文档加载到内存中并构建出DOM树。对于小到中等规模的文档,DOM是一个很好的选择,但如果处理大型的XML文件,则可能会因为内存消耗过大而导致性能问题。...
**Dom4j详解:解析XML的强大工具** Dom4j是一个开放源码的Java库,它提供了灵活且功能强大的API来处理XML文档。在Java世界中,XML作为一种数据交换格式广泛应用于各种应用程序,如配置文件、数据传输、文档存储等。...
### Java解析XML——DOM详解 #### 一、DOM解析概念 **Document Object Model (DOM)**是一种平台和语言中立的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。DOM最初是为HTML设计的,但后来也被...
- **SAX阅读器**:对于大型XML文件,DOM4J也支持SAX解析,它按事件驱动的方式逐行读取XML,仅处理当前需要的部分,降低了内存需求。可以使用`SAXReader`类进行SAX解析。 **3. XPath查询** DOM4J的XPath支持使得...
DOM4J的设计遵循了Java集合框架,并且与DOM、SAX和JAXP等XML处理API兼容,使得它在灵活性和易用性上表现优秀。 DOM4J的核心接口包括: 1. `Node`:这是DOM4J中所有XML节点的基类,包括元素(Element)、文本(Text...
StAX是基于流的解析器,它允许程序以迭代的方式按需读取XML文档。与SAX相比,StAX提供了更灵活的控制,允许开发者向前和向后导航,同时避免了DOM的内存开销。Java的`javax.xml.stream.XMLInputFactory`和`...
### DOM4J解析XML知识点详解 #### 一、DOM4J简介 DOM4J(Document Object Model for XML)是一款用于处理XML文档的轻量级Java库。它提供了一种非常简单且灵活的方式来创建、读取、修改和删除XML文档。DOM4J的主要...
- **读取XML文档**:DOM4J提供`SAXReader`和`DOMReader`两种方式。通常,`SAXReader`更适合处理大型XML文件,因为它基于事件驱动,不需要一次性加载整个文档到内存。以下是一个使用`SAXReader`读取XML文件的例子: ...