使用DOM解析XML

2017-01-13 14:58:44来源:csdn作者:StromMaybin人点击

/**
*@ 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")));
}

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台