package com.xt.xmltest;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class XmlTest {
public static void main(String[] args) throws Exception {
//获得DocumentBuilderFactory对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//获得DocumentBuilder对象
DocumentBuilder db = dbf.newDocumentBuilder();
//加载book.xml
//相对路径、绝对路径都行
Document document = db.parse("book.xml");
//获得book节点集合
NodeList bookList = document.getElementsByTagName("book");
System.out.println("================一共有"+bookList.getLength()+"本书。================");
//循环遍历book节点集合
for(int i = 0; i<bookList.getLength();i++){
//获得第i+1个book节点
Node book = bookList.item(i);
//获得第i+1个book节点中的属性的map集合
NamedNodeMap attrs = book.getAttributes();
//获得获得第i+1个book节点中的子节点的集合
NodeList childNodeList = book.getChildNodes();
System.out.println("第"+(i+1)+"个book节点中,共有"+attrs.getLength()+"个属性。");
for(int j=0;j<attrs.getLength();j++){
//获得属性名称
System.out.println("第"+(j+1)+"个属性名称是:"+attrs.item(j).getNodeName());
//获得属性值
System.out.println("第"+(j+1)+"个属性值是:"+attrs.item(j).getNodeValue());
}
//输出的结果应该是:7,9。因为在java解析xml文件的时候,会将 换行 当成一个子节点
System.out.println("第"+(i+1)+"个book节点中,共有"+childNodeList.getLength()+"个子节点。");
for(int j=0;j<childNodeList.getLength();j++){
//将换行产生的子节点去除
if(childNodeList.item(j).getNodeType()==Node.ELEMENT_NODE){
//获得子节点名称以及节点值
//获得节点值得时候要注意:java解析过程中,会将节点之间的内容看成是子节点的子节点
System.out.println(childNodeList.item(j).getNodeName()+"-------->"+childNodeList.item(j).getFirstChild().getNodeValue());
System.out.println("==================================");
}
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<bookstore>
<book id="1">
<name>钢铁是怎样炼成的</name>
<author>奥斯特洛夫斯基</author>
<price>99</price>
</book>
<book id="2">
<name>安徒生童话</name>
<author>安徒生</author>
<price>99</price>
<year>1999</year>
</book>
</bookstore>