xml解析之DOM
原创
©著作权归作者所有:来自51CTO博客作者风云正的原创作品,请联系作者获取转载授权,否则将追究法律责任
DOM Document Object Model 文档对象模型
如果一个程序需要进行DOM解析读操作的话,需要按照如下的步骤进行
建立DocumentBuilderFactory DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
建立DocumentBuilder DocumentBuilder builder = factory.newDocumentBuilder();
建立Document Document doc = builder.parse("要读取的文件路径");
建立NodeList NodeList nl = doc.getElementsByTagName("读取节点");
进行xml信息读取。
要解析文件——d:\dom_demo_02.xml
<?xml version="1.0" encoding="GBK"?>
<addresslist>
<name>张三</name>
</addresslist>
读取结点:
public class DOMDemo01 {
public static void main(String[] args) {
// 1、建立DocumentBuilderFactory,以用于取得DocumentBuilder
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2、通过DocumentBuilderFactory取得DocumentBuilder
DocumentBuilder builder = null;
try {
builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
// 3、定义Document接口对象,通过DocumentBuilder类进行DOM树的转换操作
Document doc = null;
try {
// 读取指定路径的xml文件
doc = builder.parse("D:" + File.separator + " dom_demo_02.xml");
} catch (Exception e) {
e.printStackTrace();
}
// 4、查找name的节点
NodeList nl = doc.getElementsByTagName("name");
// 5、输出NodeList中第一个子节点中文本节点的内容
System.out.println("姓名:" + nl.item(0).getFirstChild().getNodeValue());
}
}
定义要解析的XML文件 d:\dom_demo_02.xml:
<?xml version="1.0" encoding="GBK"?>
<addresslist>
<linkman>
<name>张三</name>
<email>mldnqa@163.com</email>
</linkman>
<linkman>
<name>MLDN</name>
<email>mldnkf@163.com</email>
</linkman>
</addresslist>
public class DOMDemo01 {
public static void main(String[] args) {
// 1、建立DocumentBuilderFactory,以用于取得DocumentBuilder
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2、通过DocumentBuilderFactory取得DocumentBuilder
DocumentBuilder builder = null;
try {
builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
// 3、定义Document接口对象,通过DocumentBuilder类进行DOM树的转换操作
Document doc = null;
try {
// 读取指定路径的xml文件
doc = builder.parse("D:" + File.separator + " dom_demo_02.xml");
} catch (Exception e) {
e.printStackTrace();
}
// 4、查找linkman的节点
NodeList nl = doc.getElementsByTagName("linkman");
// 5、输出NodeList中第一个子节点中文本节点的内容
for (int x = 0; x < nl.getLength(); x++) { // 循环输出节点内容
Element e = (Element) nl.item(x) ;// 取得每一个元素
System.out.println("姓名:" + e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());
System.out.println("邮箱:" + e.getElementsByTagName("email").item(0).getFirstChild().getNodeValue());
}
}
}
生成XML文件:
public class DOMDemo01 {
public static void main(String[] args) {
// 1、建立DocumentBuilderFactory,以用于取得DocumentBuilder
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2、通过DocumentBuilderFactory取得DocumentBuilder
DocumentBuilder builder = null;
try {
builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
// 3、定义Document接口对象,通过DocumentBuilder类进行DOM树的转换操作
Document doc = null;
doc = builder.newDocument(); // 创建一个新的文档
// 4、建立各个操作节点
Element addresslist = doc.createElement("addresslist") ;// 建立节点
Element linkman = doc.createElement("linkman") ; // 建立节点
Element name = doc.createElement("name") ; // 建立节点
Element email = doc.createElement("email") ; // 建立节点
// 5、设置节点的文本内容,即:为每一个节点添加文本节点
name.appendChild(doc.createTextNode("张三")) ; // 设置文本
email.appendChild(doc.createTextNode("mldnqa@163.com")) ;// 设置文本
// 6、设置节点关系
linkman.appendChild(name) ; // 子节点
linkman.appendChild(email) ; // 子节点
addresslist.appendChild(linkman) ; // 子节点
doc.appendChild(addresslist) ; // 文档上保存节点
// 7、输出文档到文件之中
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = null;
t = tf.newTransformer();
t.setOutputProperty(OutputKeys.ENCODING, "GBK") ; // 设置编码
DOMSource source = new DOMSource(doc); // 输出文档
StreamResult result = new StreamResult(new File("d:" + File.separator
+ "output.xml")); // 指定输出位置
t.transform(source, result);
}
}