`
步行者
  • 浏览: 170156 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

DOM 与 DOM 解析详解(四)以DOM方式解析XML

    博客分类:
  • XML
阅读更多

    以 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>>


 

 

 

 

 

 

 

 

 

 

 

分享到:
评论
3 楼 步行者 2009-06-03  
XPathFactory xpathFactory = XPathFactory.newInstance();
		XPath xpath = xpathFactory.newXPath();
		/*
		 * 如果这个XPath表达式会被求值多次最好用下面这种求值方式
		 * 先编译XPath表达式
		 * XPathExpression xpathExpr = xpath.compile("//book/name/text()");
		 * NodeList nodeList = (NodeList)xpathExpr.evaluate(document, XPathConstants.NODESET);
		 */
		NodeList nodeList = (NodeList)xpath.evaluate("//book/name/text()", doc, XPathConstants.NODESET);
		if(nodeList != null){
			for(int i = 0; i < nodeList.getLength();i++){
				System.out.println("  <<"+nodeList.item(i).getNodeValue()+">>");
			}
		}

这段用XPath来查找所有书名的代码比上面的代码简单多了
(实际上用DOM解析xml是最复杂的,有很多途径可以
轻松解析XML,比如用JDOM。。)
输出结果为:
    <<Thinking in JAVA>>
    <<Core JAVA2>>
    <<C++ primer>>
2 楼 步行者 2009-06-02  
ray_linn 写道
java的DOM解析实在有点无里头

比如这个
  DocumentBuilderFactory builderFactory = DocumentBuilderFactory   
              .newInstance();   
 DocumentBuilder builder = builderFactory.newDocumentBuilder();   



这些语义不清楚的Factory和builder就是让语句看得更复杂。

呵呵 所以更多的人喜欢用jdom 和 dom4j
但是理解JAVA DOM里的一些概念还是必要的
毕竟它是W3C DOM的JAVA标准实现,
而且大部分开源DOM解析器,都支持与JAVA
标准DOM之间的转换,
至于factory和builder我也觉得敲起来有点
麻烦,但是语义还是比较明确的 就是用工厂类
创建一个文档(Document)构造器,至于为什么
这么麻烦,可能是为了让DOM API更容易扩展。
1 楼 ray_linn 2009-06-02  
java的DOM解析实在有点无里头

比如这个
  DocumentBuilderFactory builderFactory = DocumentBuilderFactory   
              .newInstance();   
 DocumentBuilder builder = builderFactory.newDocumentBuilder();   



这些语义不清楚的Factory和builder就是让语句看得更复杂。

相关推荐

    dom4j解析xml详解

    ### DOM4J解析XML详解 #### 一、DOM4J简介与特性 DOM4J是一个由dom4j.org开发的开源XML解析包,专为Java平台设计,它不仅支持DOM、SAX和JAXP标准,还巧妙地融入了Java集合框架,使其成为Java开发者在处理XML数据时...

    java_Dom4j解析XML详解

    Java DOM4J解析XML详解 XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件和文档存储等领域。DOM4J是Java中一个强大的、轻量级的处理XML的库,它提供了丰富的API来读取、...

    dom4j解析xml详解,包含源代码,dom4j.jar包

    DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了简单而灵活的API,使得在Java应用程序中读取、写入、修改以及查询...提供的源代码和解析XML详解文档将有助于进一步理解DOM4J的工作机制,并提升实际开发能力。

    dom4j---xml解析jar包

    **DOM4J——XML解析库详解** XML(eXtensible Markup Language)作为一种标记语言,广泛应用于数据交换、配置文件和文档存储等领域。在Java环境中,解析XML文档时,我们通常会遇到各种库,其中DOM4J是一个非常流行...

    java中四种操作(dom、sax、jdom、dom4j)xml方式详解与比较.txt )

    java中四种操作(dom、sax、jdom、dom4j)xml方式详解与

    Dom4j遍历解析XML

    ### Dom4j遍历解析XML知识点详解 #### 一、Dom4j简介及环境搭建 Dom4j(Document Object Model for Java)是一个Java语言的开源XML API,它提供了非常便捷的方式来解析、创建以及操作XML文档。相较于其他XML解析库...

    dom4j解析xml实例

    **DOM4J解析XML实例详解** 在Java编程中,处理XML文档是一项常见的任务。DOM4J是一个非常流行的、强大的Java XML API,它提供了灵活且高效的方式来解析、创建、修改XML文档。本文将深入探讨如何使用DOM4J进行XML...

    java_Dom4j解析XML详解.doc

    ### 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 解析 XML 文件过程详解是指使用 JAVA 语言通过 DOM(Document Object Model)解析 XML 文件的过程。DOM 是一种应用程序接口(API),它将 XML 文档转换为一个树形结构,...

    XML解析技术DOM4J解析

    ### XML解析技术DOM4J解析 #### DOM4J解析概览 DOM4J是一种高性能、功能强大且极其易于使用的Java XML API,它最初是作为JDOM的一个智能分支发展起来的,自2000年下半年开始持续开发。DOM4J不仅在功能上超越了基本...

    dom4j解析xml

    ### DOM4J解析XML知识点详解 #### 一、DOM4J简介 DOM4J是一个Java库,用于处理XML文档。它的设计目标是为了提供一个简单、易于使用的API来处理XML文件,同时保持性能上的优势。与Java标准库中的DOM实现相比,DOM4J...

    Android创建与解析XML(二)——详解Dom方式

    DOM方式解析XML是一种内存密集型的操作方式,因为它需要将整个文档加载到内存中并构建出DOM树。对于小到中等规模的文档,DOM是一个很好的选择,但如果处理大型的XML文件,则可能会因为内存消耗过大而导致性能问题。...

    Dom4j例子,可以解析大部分的XML

    **Dom4j详解:解析XML的强大工具** Dom4j是一个开放源码的Java库,它提供了灵活且功能强大的API来处理XML文档。在Java世界中,XML作为一种数据交换格式广泛应用于各种应用程序,如配置文件、数据传输、文档存储等。...

    java解析xml——dom

    ### Java解析XML——DOM详解 #### 一、DOM解析概念 **Document Object Model (DOM)**是一种平台和语言中立的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。DOM最初是为HTML设计的,但后来也被...

    dom4j.jar包,java解析xml dom4j.jar包

    - **SAX阅读器**:对于大型XML文件,DOM4J也支持SAX解析,它按事件驱动的方式逐行读取XML,仅处理当前需要的部分,降低了内存需求。可以使用`SAXReader`类进行SAX解析。 **3. XPath查询** DOM4J的XPath支持使得...

    java_Dom4j解析XML详解.docx

    DOM4J的设计遵循了Java集合框架,并且与DOM、SAX和JAXP等XML处理API兼容,使得它在灵活性和易用性上表现优秀。 DOM4J的核心接口包括: 1. `Node`:这是DOM4J中所有XML节点的基类,包括元素(Element)、文本(Text...

    Java中四种XML解析技术详解

    StAX是基于流的解析器,它允许程序以迭代的方式按需读取XML文档。与SAX相比,StAX提供了更灵活的控制,允许开发者向前和向后导航,同时避免了DOM的内存开销。Java的`javax.xml.stream.XMLInputFactory`和`...

    dom4j解析xml.txt

    ### DOM4J解析XML知识点详解 #### 一、DOM4J简介 DOM4J(Document Object Model for XML)是一款用于处理XML文档的轻量级Java库。它提供了一种非常简单且灵活的方式来创建、读取、修改和删除XML文档。DOM4J的主要...

    java_Dom4j解析XML详解.pdf

    - **读取XML文档**:DOM4J提供`SAXReader`和`DOMReader`两种方式。通常,`SAXReader`更适合处理大型XML文件,因为它基于事件驱动,不需要一次性加载整个文档到内存。以下是一个使用`SAXReader`读取XML文件的例子: ...

Global site tag (gtag.js) - Google Analytics