1.首先创建一个DocumentBuilderFactor的对象(注意,所用到的包均为org.w3c.dom目录下的相应的类)
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
2.创建一个DocumentBuilder对象。(此处需要捕获异常)
DocumentBuilder db = dbf.newDocumentBuilder();
3.通过DocumentBuilder的parse方法加载xml文件到当前目录下
Document d = db.parse("books.xml");
NodeList bookList = d.getElementsByTagName("book");
int length = bookList.getLength();
for(int i = 0; i < length; i++){
Node book = bookList.item(i);
}
不知道一共有多少属性,用以下方法:
(1)获取该节点所有属性。
NamedNodeMap attrs = book.getAttributes();
int attrLength = attrs.getLength();
(3)对属性进行遍历。
for(int j = 0; j < attrLength; j++){
Node attr = attrs.item(j);
System.out.print("属性名:" + attr.getNodeName());
System.out.println("--属性值:" + attr.getNodeValue());
}
如果知道只有一个特定属性,可以用下面的方法,比如知道只有id属性。
Element element = (Element)bookList.item(i);//得到元素
System.out.println("id的值为:" + element.getAttribute("id"));
8.获取子节点
(1)遍历子节点
NodeList childNodes = book.getChildNodes();
int childLength = childNodes.getLength();
(3)对子节点进行遍历,childNodes.item(k)得到第k的子节点。
但是得到的子节点包含空白,比如<book>和<name>中的空白。所以得到的长度是9,需要进行判断是不是有内容的子节点。
childNodes.item(k).getNodeType() == Node.ELEMENT_NODE
(4)上述条件得到满足,得到子节点的名称。
childNodes.item(k).getNodeName()
(5)得到子节点的内容
childNodes.item(k).getFirstChild().getNodeValue()
childNodes.item(k).getNodeValue()
会得到空值,因为子节点中的内容也算作节点的子节点,所以需要获得第一个子节点的value.
另外一种方法:
childNodes.item(k).getTextContent()
区别:
对于<name><a>hah</a>你好</name>
前者:
后者:
前者因为是获取第一个子节点,多疑变成了<a>同时它的内容也是它的第一个子节点的value,不能直接得到value.
后者获取的是<name>标签中的内容。
俩者使用的时候需要进行判断。
以上。
=================================================================================================================================
代码如下:
books.xml
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<name>Java编程思想</name>
<author>BruceEckel</author>
<year>2007</year>
<price>$86.5</price>
</book>
<book id="2">
<name>深入理解Java虚拟机</name>
<author>GPF</author>
<price>$86.5</price>
<language>English</language>
</book>
</bookstore>
TestDOM.java
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class TestDOM {
public static void main(String[] args) {
//创建一个DocumentBuilderFactor对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
//创建一个DocumentBuilder对象
DocumentBuilder db = dbf.newDocumentBuilder();
//通过db的parse方法加载xml文件到当前目录下
Document d = db.parse("books.xml");
//获取所有的书的节点
NodeList bookList = d.getElementsByTagName("book");
//获得节点数量
int length = bookList.getLength();
System.out.println("一共有" + length + "本书");
System.out.println();
for(int i = 0; i < length; i++){
System.out.println("开始遍历第" + (i+1) + "本书:");
//获取一本书
Node book = bookList.item(i);
//获取所有属性
NamedNodeMap attrs = book.getAttributes();
//获取属性长度
int attrLength = attrs.getLength();
System.out.println("第" + (i+1) + "本书共有" + attrLength + "属性");
for(int j = 0; j < attrLength; j++){
Node attr = attrs.item(j);
System.out.print("属性名:" + attr.getNodeName());
System.out.println("--属性值:" + attr.getNodeValue());
}
//遍历子节点
NodeList childNodes = book.getChildNodes();
int childLength = childNodes.getLength();
for(int k = 0; k < childLength; k++){
//获取有用的子节点
if(childNodes.item(k).getNodeType() == Node.ELEMENT_NODE){
System.out.print(childNodes.item(k).getNodeName() + ":");
// System.out.println(childNodes.item(k).getFirstChild().getNodeValue());
System.out.println(childNodes.item(k).getTextContent());
}
}
System.out.println("第" + (i+1) + "本书遍历完毕!");
System.out.println();
/*//如果知道只有一个id属性
Element element = (Element)bookList.item(i);
System.out.println("id的值为:" + element.getAttribute("id"));*/
}
} catch (Exception e) {
// TODO: handle exception
}
}
}