java对XML文档的操作之dom(使用jaxp,sun公司的自带包)
程序员文章站
2022-05-28 14:59:40
...
测试的XML文档:(注意,该文档是放在src文件夹下的,不是和java文件放在同一个包,不然读取xml时会出错)
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<商店>
<商品>
<名称 name="hhhhh">A商品</名称>
<价格>890元</价格>
<数量>1</数量>
</商品>
<商品>
<名称>B商品</名称>
<价格>50</价格>
<数量>5</数量>
</商品>
</商店>
java代码(包括对XML文档的增删改查)
package com.cx.day0802;
import java.io.FileOutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class Demo1 {
@Test
public void read() throws Exception{
//读取dom文档,读取某个节点的内容
//1、获取 DocumentBuilderFactory 的新实例。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//2、创建一个新的 DocumentBuilder 实例。
DocumentBuilder builder = factory.newDocumentBuilder();
//3、获得dom对象
Document dom = builder.parse("src/test.xml");
//获取指定标签
NodeList list = dom.getElementsByTagName("价格");
//获取第几个的标签从0开始
Node node = list.item(0);
//输出标签体
System.out.println(node.getTextContent());
}
@Test
public void read1() throws Exception{
//读取dom文档,读取某个节点的属性
//1、获取 DocumentBuilderFactory 的新实例。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//2、创建一个新的 DocumentBuilder 实例。
DocumentBuilder builder = factory.newDocumentBuilder();
//3、获得dom对象
Document dom = builder.parse("src/test.xml");
//获取指定标签的属性,,这里强制转换为Element类型,直接操作根据属性名取值
Element e = (Element) dom.getElementsByTagName("名称").item(0);
System.out.println(e.getAttribute("name"));
}
@Test
public void read2() throws Exception{
//读取dom文档,读取所有节点标签
//1、获取 DocumentBuilderFactory 的新实例。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//2、创建一个新的 DocumentBuilder 实例。
DocumentBuilder builder = factory.newDocumentBuilder();
//3、获得dom对象
Document dom = builder.parse("src/test.xml");
//获取根节点
Node root = dom.getElementsByTagName("商店").item(0);
//递归实现
list(root);
}
private void list(Node node) {
//如果是节点元素就输出
if(node instanceof Element){
System.out.println(node.getNodeName());
}
//获取节点的子节点
NodeList clist = node.getChildNodes();
//循环输出子节点标签
for(int i=0; i<clist.getLength();i++){
//递归
list(clist.item(i));
}
}
@Test
public void add() throws Exception{
//读取dom文档,增加节点标签
//1、获取 DocumentBuilderFactory 的新实例。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//2、创建一个新的 DocumentBuilder 实例。
DocumentBuilder builder = factory.newDocumentBuilder();
//3、获得dom对象
Document dom = builder.parse("src/test.xml");
//读取要增加节点标签的父节点,强制转换为Element
Element e = (Element) dom.getElementsByTagName("商品").item(0);
//建立新节点
Element newE = dom.createElement("新标签");
newE.setTextContent("400元");
//向父节点增加新节点标签
e.appendChild(newE);
//从内存中保存到xml文档中
//实例化TransformerFactory工厂类,将源树转换为结果树。
TransformerFactory tffactor = TransformerFactory.newInstance();
//创建执行从 Source 到 Result 的复制的新 Transformer。
Transformer tf = tffactor.newTransformer();
//将 XML Source 转换为 Result。
tf.transform(new DOMSource(dom), new StreamResult(new FileOutputStream("src/test.xml")));
}
@Test
public void add1() throws Exception{
//读取dom文档,向指定位置增加节点标签
//1、获取 DocumentBuilderFactory 的新实例。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//2、创建一个新的 DocumentBuilder 实例。
DocumentBuilder builder = factory.newDocumentBuilder();
//3、获得dom对象
Document dom = builder.parse("src/test.xml");
//读取要增加节点标签的父节点,强制转换为Element
Element e = (Element) dom.getElementsByTagName("商品").item(0);
//建立新节点
Element newE = dom.createElement("新标签");
newE.setTextContent("400元");
//获得指定位置之后的节点
Element ref = (Element) dom.getElementsByTagName("价格").item(0);
//向父节点增加新节点标签
e.insertBefore(newE, ref);
//从内存中保存到xml文档中
//实例化TransformerFactory工厂类,将源树转换为结果树。
TransformerFactory tffactor = TransformerFactory.newInstance();
//创建执行从 Source 到 Result 的复制的新 Transformer。
Transformer tf = tffactor.newTransformer();
//将 XML Source 转换为 Result。
tf.transform(new DOMSource(dom), new StreamResult(new FileOutputStream("src/test.xml")));
}
@Test
public void delete() throws Exception{
//读取dom文档,删除指定位置节点标签
//1、获取 DocumentBuilderFactory 的新实例。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//2、创建一个新的 DocumentBuilder 实例。
DocumentBuilder builder = factory.newDocumentBuilder();
//3、获得dom对象
Document dom = builder.parse("src/test.xml");
Element e = (Element) dom.getElementsByTagName("新标签").item(0);
//获得该节点的父节点,其父节点删除该节点
e.getParentNode().removeChild(e);
//从内存中保存到xml文档中
//实例化TransformerFactory工厂类,将源树转换为结果树。
TransformerFactory tffactor = TransformerFactory.newInstance();
//创建执行从 Source 到 Result 的复制的新 Transformer。
Transformer tf = tffactor.newTransformer();
//将 XML Source 转换为 Result。
tf.transform(new DOMSource(dom), new StreamResult(new FileOutputStream("src/test.xml")));
}
@Test
public void update() throws Exception{
//读取dom文档,删除指定位置节点标签
//1、获取 DocumentBuilderFactory 的新实例。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//2、创建一个新的 DocumentBuilder 实例。
DocumentBuilder builder = factory.newDocumentBuilder();
//3、获得dom对象
Document dom = builder.parse("src/test.xml");
Element e = (Element) dom.getElementsByTagName("价格").item(0);
//获得该节点的父节点,其父节点删除该节点
e.setTextContent("890元");
//从内存中保存到xml文档中
//实例化TransformerFactory工厂类,将源树转换为结果树。
TransformerFactory tffactor = TransformerFactory.newInstance();
//创建执行从 Source 到 Result 的复制的新 Transformer。
Transformer tf = tffactor.newTransformer();
//将 XML Source 转换为 Result。
tf.transform(new DOMSource(dom), new StreamResult(new FileOutputStream("src/test.xml")));
}
}
下一篇: 《将博客搬至CSDN》