用DOM方式解析XML
一、用DOM方式解析XML

此例子節點結構如下:

1、獲取book節點屬性
(1).如果不知道節點的屬性,通過 NamedNodeMap attrs = book.getAttributes(); 來獲取屬性的集合(藍色部分代碼)
(2)、如果知道book節點有且只有一個id屬性,則用
Element book = (Element)bookList.item(i);
String attrValue = book.getAttribute("id");
來遍歷屬性,將藍色部分替換為黃色部分
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.NodeList;
import org.xml.sax.SAXException;
public class DomTest {
public static void main(String[] args) {
//1.創建一個DocumentBuilderFactory對象
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//2.創建一個DocumentBuilder對象
try {
//3.創建一個Document對象
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//4.通過Document對象的perse方法加載book。xml文件到當前項目下
Document document = documentBuilder.parse("book.xml");
//獲取book結點的集合
NodeList bookList = document.getElementsByTagName("book");
//遍歷每一個book節點
//獲取bookLength()長度
System.out.println("共有" + bookList.getLength() + "本書");
for(int i = 0;i < bookList.getLength();i++) {
System.out.println("現在開始遍歷第" + (i + 1) + "本書---");
//通過item(i)獲取book節點,下標從0開始
Node book = bookList.item(i);
//獲取book屬性集合
NamedNodeMap attrs = book.getAttributes();
//遍歷book屬性
System.out.println("第" + (i + 1) + "本書共有" + attrs.getLength()+ "個屬性");
for(int j = 0;j < attrs.getLength();j++) {
//通過item()獲取屬性
Node attr = attrs.item(j);
System.out.print("屬性名" + attr.getNodeName());
System.out.println(" 屬性值" + attr.getNodeValue());
}
Element book = (Element)bookList.item(i);
String attrValue = book.getAttribute("id");
System.out.println(attrValue);
System.out.println("第" + (i + 1) + "本書遍歷完畢");
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、遍歷book的子節點的屬性
(1)、用 NodeList childNodes = book.getChildNodes(); 來獲取子節點的屬性
(2)、用 getValue()不能得到子節點值, 因為Element類型getValue()返回null
(3)、用 childNodes.item(k).getFirstChild().getNodeValue() 可以得不到子節點的值(藍色部分)
(4)、用 childNodes.item(k).getTextContent() 可以得到子節點的值(黃色部分)
public class DomTest {
public static void main(String[] args) {
//1.創建一個DocumentBuilderFactory對象
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//2.創建一個DocumentBuilder對象
try {
//3.創建一個Document對象
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//4.通過Document對象的perse方法加載book。xml文件到當前項目下
Document document = documentBuilder.parse("book.xml");
//獲取book結點的集合
NodeList bookList = document.getElementsByTagName("book");
//遍歷每一個book節點
//獲取bookLength()長度
System.out.println("共有" + bookList.getLength() + "本書");
for(int i = 0;i < bookList.getLength();i++) {
System.out.println("------------現在開始遍歷第" + (i + 1) + "本書---------");
//通過item(i)獲取book節點,下標從0開始
Node book = bookList.item(i);
//獲取book屬性集合
NamedNodeMap attrs = book.getAttributes();
//遍歷book屬性
System.out.println("第" + (i + 1) + "本書共有" + attrs.getLength()+ "個屬性");
for(int j = 0;j < attrs.getLength();j++) {
//通過item()獲取屬性
Node attr = attrs.item(j);
System.out.print("屬性名" + attr.getNodeName());
System.out.println(" 屬性值" + attr.getNodeValue());
}
NodeList childNodes = book.getChildNodes();
//遍歷childNodes獲取節點名和結點值
System.out.println("第" + (i + 1) + "本書共有" +
childNodes.getLength() + "個子節點");
for(int k = 0;k < childNodes.getLength();k++) {
//區分text類型的Node和Element類型的Node
if(childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
//獲取Element節點名和節點名
System.out.print("第" + (k + 1) + "個節點的節點名是" +
childNodes.item(k).getNodeName());
System.out.println("----節點的節點值是" +
childNodes.item(k).getFirstChild().getNodeValue());
System.out.println("----節點的節點值是" +
childNodes.item(k).getTextContent());
}
}
System.out.println("------------第" + (i + 1) + "本書遍歷完畢-------------");
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
(5)、如果節點變成這樣

加上一個節點,childNodes.item(k).getFirstChild().getNodeValue() 返回的是null,不是節點值,此時getFirstChild為<aaa>節點,Element類型。
而 childNodes.item(k).getTextContent() 返回的正常的子節點值
小白一枚,還有不懂得地方:加上<aaa>節點之后getFirstChild().getNodeValue() 為什么返回不了“ADD”呢?
歡迎批評指正,謝謝。
浙公網安備 33010602011771號