慕课网学习DOM方法解析XML文件总结

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");


4.根据标签名获取所有该名称的标签(此处获取book标签,XML文件见下)

NodeList bookList = d.getElementsByTagName("book");


5.为了遍历,需要获得一共有多少节点。

int length = bookList.getLength();


6.进行遍历,获取每一本书。

for(int i = 0; i < length; i++){
	Node book = bookList.item(i);
}


7.开始获取标签属性。

不知道一共有多少属性,用以下方法:

(1)获取该节点所有属性。

NamedNodeMap attrs = book.getAttributes();


(2)获得属性的长度。

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();


(2)同样,获取子节点数目

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
		}
	}

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值