前面用DOM解析XML只是对里面的数据读取出来,而DOM解析最大的优势并不是读取,而是可以方便的修改里面的元素。
接着上回的代码,在类中新建一个方法来进行XML文件的修改和增加节点操作。
DOM修改的原理是,DOM在读取XML文件时读入的是文件中所有的节点组成一个DOM树的Document文件,这个文件被读取出来之后我们用JAVA语言可以操作它,不过这样修改也仅仅是修改了JAVA中的这个对象而已,所有在我们将DOM文件修改完了之后还要进行保存工作,这样才是真正的做到了修改XML文件。
原来的XML文档:
<?xml version="1.0" encoding="utf-8"?> <student> <stu num="1111"> <name>张三丰</name> <sex>男</sex> <cla>武当</cla> </stu> <stu num="2345"> <name>小龙女</name> <sex>女</sex> <cla>古墓</cla> </stu> </student>
代码:
/**
* 修改XML文件
* @throws Exception
*/
public static void changeXML(Document doc) throws Exception{
//------------------------修改节点中元素的内容
//找到要修改的节点名称的所有节点,得到名字相同的节点队列
NodeList nodes = doc.getElementsByTagName("name");
//在队列中选择要修改的节点
Node n = nodes.item(0);
//修改该节点的文本
n.setTextContent("逗逼");
//------------------------增加节点的子元素
//找到要修改的节点名称的所有节点,得到名字相同的节点队列
NodeList nodes1 = doc.getElementsByTagName("student");
//在队列中选择要修改的节点
Node n1 = nodes1.item(0);
//创建要增加的节点元素
Element nn = doc.createElement("stu");
//设置节点属性
Attr attr = doc.createAttribute("num");
attr.setValue("6666");
nn.setAttributeNode(attr);
//增加新元素stu的子元素
//姓名
Element nn1 = doc.createElement("name");
nn1.setTextContent("第三个");
nn.appendChild(nn1);
n1.appendChild(nn);
//性别
Element nn2 = doc.createElement("sex");
nn2.setTextContent("第三个");
nn.appendChild(nn2);
n1.appendChild(nn);
//班级
Element nn3 = doc.createElement("cla");
nn3.setTextContent("第三个");
nn.appendChild(nn3);
n1.appendChild(nn);
System.out.println(doc.getElementsByTagName("stu").getLength());
//-------------------------保存到文件中
//创建一个用来转换DOM对象的工厂对象
TransformerFactory factory = TransformerFactory.newInstance();
//获得转换器对象
Transformer t = factory.newTransformer();
//定义要转换的源对象
DOMSource xml = new DOMSource(doc);
//定义要转换到的目标文件
StreamResult s = new StreamResult(new File("D:\\xmlEX\\student4.xml"));
//开始转换
t.transform(xml, s);
}
修改后的XML文档:
<?xml version="1.0" encoding="utf-8" standalone="no"?><student>
<stu num="1111">
<name>逗逼</name>
<sex>男</sex>
<cla>武当</cla>
</stu>
<stu num="2345">
<name>小龙女</name>
<sex>女</sex>
<cla>古墓</cla>
</stu>
<stu num="6666">
<name>第三个</name>
<sex>第三个</sex>
<cla>第三个</cla>
</stu>
</student>
从这次的练习得出一个发现,如果直接给一个节点添加一个子节点stu,而且该子节点stu没有其他的子节点的话,那么这个stu在XML保存操作之后,会在文件中显示成<stu/>,只有当这个节点stu有子节点的时候,才会显示成<stu></stu>的两对尖括号的形式.....