以 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-1.6.1.rar(内有dom4j-1.6.1.jar包和附加包),解析xml详解文档,解析xml的java源码。
java中四种操作(dom、sax、jdom、dom4j)xml方式详解与
java_Dom4j解析XML详解.doc
java_Dom4j解析XML详解.docx
java_Dom4j解析XML详解.pdf
DOM4J是 dom4j.org 出品的一个开源 XML 解析包。DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP。 DOM4J 使用起来非常简单。只要你了解基本的 XML-DOM 模型,就能使用。 Dom:把整个...
JSP基于dom解析xml实例详解.docx
主要介绍了JAVA DOM解析XML文件过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
xmldom属性与方法详解[参照].pdf
在Demo中,解析XML到前台显示用的是JDOM,而在模拟Bean工厂解析spring-config的时候,用的是DOM4J的解析方式,两者各有优点,如果你细心的话,可在源代码中发现两者的区别,祝你也早日了解XML的解析原理。
xml 解析方式有四种--DOM 、SAX、JDOM、DOM4J。
Java 利用dom方式读取、创建xml详解及实例代码.docx
在Android中,常见的XML解析器分别为SAX解析器、DOM解析器和PULL解析器,下面,我将一一向大家详细介绍。 SAX解析器: SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着...
主要介绍了JSP基于dom解析xml的方法,以完整实例形式较为详细的分析了JSP使用dom针对xml文件解析的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
主要介绍了详解Android之解析XML文件三种方式,主要包括DOM,PULL,SAX,有兴趣的可以了解一下。
该文档详细介绍了xml 文件的元素类型,与元素的读取和操作