我们可以看到网上一大堆修改DOM,修改XML,但却很少见那些说修改完后怎么重新写入XML。
废话少说,我们进入正题。 1)读取XML。
如果搞过JAVA的朋友,相应这个应该问题不大。简单的用DocumentBuilder就可以得到一个包含我们需要的XML文件的一个Document对象,这个Document对象也即相当于我们在浏览器解析过程中经常说的DOM树,它包含了一些标签,属性和值等。
见代码:
Java代码
1. DocumentBuilderFactory dfb = DocumentBuilderFactory.newInstance(); 2. DocumentBuilder db = dfb.newDocumentBuilder(); 3. Document doc = db.parse(new File(\"F:\\\\interlib\\\\myeclipseWS\\\\SyncReaderFramework\\\\src\\\est.xml\"));
这里的test.xml文件内容大概如下:
Xml代码
1. 2. 3.
当然这是我们手工建的。
我们读取XML的目的是进行修改,那么究竟如何修改呢?
很简单,因为上面我们已经取到Document对象,即DOM结构及相应的值,我们只需要取到相应的标签或属性,设置相应的值就可以了。
Java代码
1. NodeList nodeList = doc.getElementsByTagName(\"title\"); 2. for (int i = 0; i < nodeList.getLength(); i++) { 3. Element ele = (Element)nodeList.item(i);
4. NamedNodeMap attributes = ele.getAttributes(); 5. for (int k = 0; k < attributes.getLength(); k++) {
6. System.out.println(\"Attribute:\"+attributes.item(i).getNodeValue()); 7. }
8. Node node = attributes.getNamedItem(\"name\"); 9. //设置NAME属性的值
10.node.setNodeValue(\"shun\");
11.System.out.println(\"Node Value:\"+node.getNodeValue()); 12.}
这段代码也很简单,只是对得title标签的内标签,然后逐个进行遍历,并取得它的属性,这里我们取得name属性,并设置了相应的值shun。接下来打印出设置后的值,表明我们已经修改了。
我们来看一下完整的代码:
Java代码
1. package com.interlib.test; 2.
3. import java.io.File;
4. import java.io.FileOutputStream; 5. import java.io.IOException; 6.
7. import javax.xml.parsers.DocumentBuilder;
8. import javax.xml.parsers.DocumentBuilderFactory;
9. import javax.xml.parsers.ParserConfigurationException; 10.import javax.xml.transform.Transformer;
11.import javax.xml.transform.TransformerConfigurationException; 12.import javax.xml.transform.TransformerException; 13.import javax.xml.transform.TransformerFactory; 14.import javax.xml.transform.dom.DOMSource;
15.import javax.xml.transform.stream.StreamResult; 16.
17.import org.w3c.dom.Document; 18.import org.w3c.dom.Element;
19.import org.w3c.dom.NamedNodeMap; 20.import org.w3c.dom.Node; 21.import org.w3c.dom.NodeList; 22.import org.xml.sax.SAXException; 23.
24.public class TestDOMWriter { 25.
26.public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException, TransformerException {
27.DocumentBuilderFactory dfb =
DocumentBuilderFactory.newInstance();
28.DocumentBuilder db = dfb.newDocumentBuilder(); 29.Document doc = db.parse(new
File(\"F:\\\\interlib\\\\myeclipseWS\\\\SyncReaderFramework\\\\src\\\est.xml\")); 30.
31.NodeList nodeList = doc.getElementsByTagName(\"title\"); 32.for (int i = 0; i < nodeList.getLength(); i++) { 33.Element ele = (Element)nodeList.item(i);
34.NamedNodeMap attributes = ele.getAttributes(); 35.for (int k = 0; k < attributes.getLength(); k++) {
36.System.out.println(\"Attribute:\"+attributes.item(i).getNodeValue()); 37.}
38.Node node = attributes.getNamedItem(\"name\"); 39.//设置NAME属性的值
40.node.setNodeValue(\"shun\");
41.System.out.println(\"Node Value:\"+node.getNodeValue()); 42.} 43. 44.} 45. 46.}
运行后我们看到结果
我们看到我们设置后的值已经改变了,也即是DOM树里面的值已经改变了。但有时我们并不只需要在内存里面改变值,而是需要写回到XML文件中。那我们应该怎么做呢?DocumentBuilderFactory并没有提供相应的方法,我们需要借助另外一系列类来进行实现,TransformerFactory,Transformer等。
2)写回XML
借助上面我们提到的类我们可以把DOM树的改变写回XML文件中:
Java代码
1. FileOutputStream fos = new
FileOutputStream(\"F:\\\\interlib\\\\myeclipseWS\\\\SyncReaderFramework\\\\src\\\est.xml\");
2. TransformerFactory tFactory = TransformerFactory.newInstance(); 3. Transformer trans = tFactory.newTransformer(); 4. DOMSource source = new DOMSource(doc);
5. StreamResult result = new StreamResult(fos); 6. trans.transform(source, result);
其实这时代码也是比较简单的,可能某些朋友看上去会比较害怕,因为好几个类都没见过。
其实代码总的来说也比较简单,流程比较清晰。 1、打开文件准备写入
2、通过工厂类创建Transformer
3、通过document对象构造DOMSource,也即是DOM结构
4、StreamResult可以理解为是写入的目标,上面的文件也即是为了在这时使用
5、写入XML文件
流程是比较简单,但估计写的时候还是比较麻烦的。毕竟不熟悉的东西。
我们把上面的代码全部综合一下,对我们刚开始的XML文件内容进行修改:
Java代码
1. public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException, TransformerException {
2. DocumentBuilderFactory dfb =
DocumentBuilderFactory.newInstance();
3. DocumentBuilder db = dfb.newDocumentBuilder(); 4. Document doc = db.parse(new
File(\"F:\\\\interlib\\\\myeclipseWS\\\\SyncReaderFramework\\\\src\\\est.xml\")); 5.
6. NodeList nodeList = doc.getElementsByTagName(\"title\"); 7. for (int i = 0; i < nodeList.getLength(); i++) { 8. Element ele = (Element)nodeList.item(i);
9. NamedNodeMap attributes = ele.getAttributes(); 10.for (int k = 0; k < attributes.getLength(); k++) {
11.System.out.println(\"Attribute:\"+attributes.item(i).getNodeValue()); 12.}
13.Node node = attributes.getNamedItem(\"name\"); 14.//设置NAME属性的值
15.node.setNodeValue(\"shun\");
16.System.out.println(\"Node Value:\"+node.getNodeValue()); 17.} 18.
19.//这里重要,写入XML文件 20.FileOutputStream fos = new
FileOutputStream(\"F:\\\\interlib\\\\myeclipseWS\\\\SyncReaderFramework\\\\src\\\est.xml\");
21.TransformerFactory tFactory = TransformerFactory.newInstance(); 22.Transformer trans = tFactory.newTransformer(); 23.DOMSource source = new DOMSource(doc);
24.StreamResult result = new StreamResult(fos); 25.trans.transform(source, result); 26.
27.System.out.println(\"Finished...\");
28.}
我们运行看到结果:
运行没问题,那再看看我们的test.xml,它的内容变成了:
我们的修改完成了。但它帮我们添加了standalone=\"no\",这个表示它不是单独的XML文件,有DTD定义,这个我们先不管,我们没有定义DTD。我们看到title中name属性的值已经被我们修改成功了。
很多人会习惯用DOM4J或jdom这些工具类,他们也很有用,但JDK有现成的,感觉就没必要让项目引用太多的JAR包了。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- dfix.cn 版权所有 湘ICP备2024080961号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务