黑马程序员技术交流社区
标题:
DOM解析器的使用
[打印本页]
作者:
hejinzhong
时间:
2014-8-21 22:52
标题:
DOM解析器的使用
package com.itheima;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DocumentDemo {
public static void main(String[] args) throws Exception {
/**
* (1)创建DOM解析器工厂 (2)得到DOM解析器对象 (3)通过parse()方法产生document对象,可以代表真个XML文档
*/
DocumentBuilder db = DocumentBuilderFactory.newInstance()
.newDocumentBuilder();
Document dm = db.parse("src/book.xml");
/*
* 查询某个节点的信息 (1)根据标签名称获取节点列表 (2)根据列表获取指定节点信息
*/
test1(dm);
/*
* 遍历所有节点 (1)得到文档的根节点 (2)利用递归思想遍历
*/
test2(dm);
/*
* 修改某个节点值 (1)根据标签名称获取节点 (2)修改相应信息 (3)将修改后信息写入文件
*/
test3(dm);
/*
* 向指定元素节点中增加子元素节点 (1)获取相应节点 (2)创建一个节点 (3)将新节点作为子节点加入 (4)将修改后信息写入问价
*/
test4(dm);
/*
* 向指定元素节点上增加同级元素节点 (1)获取节点 (2)创建新ELEMENT (3)获取节点的父节点,将新元素添加为其子节点
* (4)写入文件
*/
test5(dm);
/*
* 删除指定元素节点 (1)获取该节点 (2)或去该该节点的父节点,并用其删除该节点
*/
test6(dm);
/*
* 增加属性 (1)获取节点 (2)添加属性 (3)写入文件
*/
test7(dm);
}
private static void test7(Document dm) throws Exception {
// 根据名称获取节点
Node nd = dm.getElementsByTagName("售价").item(0);
// 添加新属性,要先将其转换为元素
((Element) nd).setAttribute("sel", "跳楼价");
// 写入文件
TransformerFactory.newInstance().newTransformer()
.transform(new DOMSource(dm), new StreamResult("src/book.xml"));
}
private static void test6(Document dm) throws Exception {
// 根据名称获取节点
Node nd = dm.getElementsByTagName("出版社").item(0);
// 获取其父节点,并删除该节点
nd.getParentNode().removeChild(nd);
// 写入文件
TransformerFactory.newInstance().newTransformer()
.transform(new DOMSource(dm), new StreamResult("src/book.xml"));
}
private static void test5(Document dm) throws Exception {
// 获取作者标签的第二个节点
Node nd = dm.getElementsByTagName("作者").item(1);
// 创建一个节点,并设置内容
Element el = dm.createElement("出版社");
el.setTextContent("黑马出版");
// 获取父节点,并将新元素添加为其子节点
nd.getParentNode().appendChild(el);
// 写入文件
TransformerFactory.newInstance().newTransformer()
.transform(new DOMSource(dm), new StreamResult("src/book.xml"));
}
private static void test4(Document dm) throws Exception {
// 根据书名获取第一个ELEMENT
Node nd = dm.getElementsByTagName("书名").item(0);
// 创建一个新的ELEMENT
Element el = dm.createElement("别名");
// 为新元素设置内容
el.setTextContent("东方不败");
// 为nd添加子节点el
nd.appendChild(el);
// 将修改信息写入文件
TransformerFactory.newInstance().newTransformer()
.transform(new DOMSource(dm), new StreamResult("src/book.xml"));
}
private static void test3(Document dm) throws Exception {
// 获取第一个标签为售价的节点
Node nd = dm.getElementsByTagName("售价").item(0);
// 修改价格为50
nd.setTextContent("80");
// 将修改后的信息写入文件
Transformer tf = TransformerFactory.newInstance().newTransformer();
// 接收的两个参数分别是:源和目的
tf.transform(new DOMSource(dm), new StreamResult("src/book.xml"));
}
private static void test2(Node dm) {
// 获取文档中的所有子节点
NodeList nl = dm.getChildNodes();
// 遍历这些节点,并判断是否还为标签(ELEMENT)
for (int i = 0; i < nl.getLength(); i++) {
Node nd = nl.item(i);
// 判断类型是否是标签
if (nd.getNodeType() == Node.ELEMENT_NODE) {
System.out.println(nd.getNodeName());
test2(nd);
} else {
System.out.println(nd.getTextContent());
}
}
}
private static void test1(Document dm) {
// 根据标签名字获取一个列表
NodeList nl = dm.getElementsByTagName("售价");
// NodeList中提供了方法,获取某个位置的节点
Node nd = nl.item(0);
// 获取节点的三个属性值
System.out.println(nd.getNodeType());
System.out.println(nd.getNodeName());
System.out.println(nd.getNodeValue());
}
}
复制代码
作者:
恣意的豆腐
时间:
2014-8-22 09:12
好长啊
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2