前面用DOM解析XML只是对里面的数据读取出来,而DOM解析最大的优势并不是读取,而是可以方便的修改里面的元素。
接着上回的代码,在类中新建一个方法来进行XML文件的修改和增加节点操作。
DOM修改的原理是,DOM在读取XML文件时读入的是文件中所有的节点组成一个DOM树的Document文件,这个文件被读取出来之后我们用JAVA语言可以操作它,不过这样修改也仅仅是修改了JAVA中的这个对象而已,所有在我们将DOM文件修改完了之后还要进行保存工作,这样才是真正的做到了修改XML文件。
原来的XML文档:
class="xml" name="code"><?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>的两对尖括号的形式.....