/**
*@ author StormMaybin
*@ date 2016-10-05
*/
生命不息,奋斗不止!
DOM解析XML原理
DOM模式解析XML,是把整个XML文档当成一个对象来处理,会先把整个文档读入到内存里。是基于树的结构,通常需要加载整文档和构造DOM树,然后才能开始工作。
优缺点及适用情况
优点是可以对进行修改操作。
缺点是占用高,解析成本大。
递归遍历XML文档标签
XML文档 student.xml
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student>
<name>StormMa</name>
<age>20</age>
<height>176</height>
</student>
<student>
<name>Jack</name>
<age>21</age>
<height>178</height>
<job>coder</job>
</student>
</students>
遍历XML文档标签
package com.stormma.parse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class ParseXMLDemo1
{
public static void main(String[] args) throws Exception
{
// TODO Auto-generated method stub
getElement();
}
/**
* 遍历文档元素
* @throws Exception
*/
public static void getElement () throws Exception
{
//获得工厂实例
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//获得解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//解析文档
Document document = builder.parse("src/student.xml");
//得到根节点
Element root = (Element) document.getElementsByTagName("students").item(0);
list (root);
}
/**
* 递归函数
* @param node
*/
private static void list(Node node)
{
//剔除空白符
if (node instanceof Element)
{
System.out.println(node.getNodeName());
}
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++)
{
Node child = list.item(i);
list(child);
}
}
}
遍历结果
向XML文档添加标签
StormMa添加job标签
public class ParseXMLDemo2
{
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception
{
// TODO Auto-generated method stub
add();
}
public static void add() throws Exception
{
// 获得工厂实例
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 获得解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析文档
Document document = builder.parse("src/student.xml");
//创建要插入的标签
Element job = document.createElement("job");
job.setTextContent("student");
//得到要插入标签的父标签
Element student = (Element) document.getElementsByTagName("student").item(0);
student.appendChild(job);
//刷新更新的文档
//得到转换器
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/student.xml")));
}
}
插入結果
指定位置插入标签
在StormMa身高的前面添加job标签
> 需求:StormMa添加id属性值为1
public static void add2() throws Exception
{
// 获得工厂实例
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 获得解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析文档
Document document = builder.parse("src/student.xml");
// 创建要插入的标签
Element job = document.createElement("job");
job.setTextContent("student");
// 得到参考位置的标签(参考)
Element refNode = (Element) document.getElementsByTagName("height").item(0);
// 得到要插入标签的父标签
Element student = (Element) document.getElementsByTagName("student")
.item(0);
// 插入标签
student.insertBefore(job, refNode);
// 刷新更新的文档
// 得到转换器
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.transform(new DOMSource(document), new StreamResult(
new FileOutputStream("src/student.xml")));
}
插入结果
添加属性
需求:StormMa添加id属性值为1
/**
* 添加属性
*
* @throws Exception
*/
public static void addAttr() throws Exception
{
// 获得工厂实例
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 获得解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析文档
Document document = builder.parse("src/student.xml");
// 得到要插入属性的结点
Element student = (Element) document.getElementsByTagName("student")
.item(0);
student.setAttribute("id", "1");
// 刷新更新的文档
// 得到转换器
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.transform(new DOMSource(document), new StreamResult(
new FileOutputStream("src/student.xml")));
}
删除标签
需求:删除StormMa的job.
/**
* 删除结点(标签)
* @throws Exception
*/
public static void delete() throws Exception
{
// 获得工厂实例
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 获得解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析文档
Document document = builder.parse("src/student.xml");
//得到要删除的结点
Element e = (Element) document.getElementsByTagName("job").item(0);
//得到要删除结点的父节点
//Element fa1 = (Element) e.getParentNode();和下句效果一样。
Element fa = (Element) document.getElementsByTagName("student").item(0);
//父结点删除孩子结点
fa.removeChild(e);
// 刷新更新的文档
// 得到转换器
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.transform(new DOMSource(document), new StreamResult(
new FileOutputStream("src/student.xml")));
}
删除结果
![]()
ps:要删除某个结点,得到父亲结点,然后删除。删除整个文档同理。
删除属性
fa.removeAttribute(name);
更新标签内容
需求:更新StormMa的身高为180.
/**
* 更新标签内容
*
* @throws Exception
*/
public static void update() throws Exception
{
// 获得工厂实例
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 获得解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析文档
Document document = builder.parse("src/student.xml");
// 得到要更新的标签
Element height = (Element) document.getElementsByTagName("height").item(0);
height.setTextContent("180");
// 刷新文档内容
// 得到转换器
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.transform(new DOMSource(document), new StreamResult(
new FileOutputStream("src/student.xml")));
}