import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; dom.Document; dom.Element; dom.NamedNodeMap; dom.Node; 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(); getLength();i++){ //获取childNodes的第i个节点 Node childNode = childNodes.item(i); //判断childNode是不是一个元素节点,并且它的 nodeName 值为book if(childNode.getNodeType() == Node.ELEMENT_NODE && childNode.getNodeName().equals("book")){ //若是,则获取childNode的所有子节点(不包括属性节点),返回一个NodeList对象 getChildNodes(); getLength();j++){ //获取childNodes_2的第j个节点 item(j); //判断childNode_2是不是一个元素节点,并且它的 nodeName 值为name getNodeType() == Node.ELEMENT_NODE getNodeName().equals("name")){ //若是,则获取childNode_2的所有子节点(不包括属性节点),返回一个NodeList对象 getChildNodes(); getLength();k++){ //获取childNodes_3的第k个节点 item(k); //判断childNodes_3是不是一个文本节点 getNodeType() == Node.TEXT_NODE){ //若是,则打印输出这个文本节点的nodeValue 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 = getLength() ; i++){ printNode(attrs.item(i),count+1); } /* * node.getChildNodes()方法返回 * 包含node节点的所有子节点的 NodeList。 */ NodeList childNodes = node.getChildNodes(); for(int i = getLength() ; i++){ printNode(childNodes.item(i),count+1); } } } }
<?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>>