您好,欢迎来到抵帆知识网。
搜索
您的当前位置:首页java处理xml

java处理xml

来源:抵帆知识网
网上有很多讲解JAVA怎么处理XML,当然文章并不会再讲那些重复的东西,那些百度,GOOGLE一大堆。我们来讲讲一些网上很少讲到的,或者有,我很少找到的——就是修改XML后重新写入XML。

我们可以看到网上一大堆修改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\")); 相信这段代码再熟悉不过了,一个工具类,再一个Builder(也可以看做另外一个工厂类),最后生成一个具体的我们需要的东西。这里我们需要干啥都可以对doc进行操作了。

这里的test.xml文件内容大概如下:

Xml代码

1. 2.

3. 4. </book><p>当然这是我们手工建的。<p>我们读取XML的目的是进行修改,那么究竟如何修改呢?<p>很简单,因为上面我们已经取到Document对象,即DOM结构及相应的值,我们只需要取到相应的标签或属性,设置相应的值就可以了。<p>Java代码<p>1. NodeList nodeList = doc.getElementsByTagName(\"title\"); 2. for (int i = 0; i < nodeList.getLength(); i++) { 3. Element ele = (Element)nodeList.item(i);<p>4. NamedNodeMap attributes = ele.getAttributes(); 5. for (int k = 0; k < attributes.getLength(); k++) {<p>6. System.out.println(\"Attribute:\"+attributes.item(i).getNodeValue()); 7. }<p>8. Node node = attributes.getNamedItem(\"name\"); 9. //设置NAME属性的值<p>10.node.setNodeValue(\"shun\");<p>11.System.out.println(\"Node Value:\"+node.getNodeValue()); 12.}<p>这段代码也很简单,只是对得title标签的内标签,然后逐个进行遍历,并取得它的属性,这里我们取得name属性,并设置了相应的值shun。接下来打印出设置后的值,表明我们已经修改了。<p>我们来看一下完整的代码:<p>Java代码<p>1. package com.interlib.test; 2.<p>3. import java.io.File;<p>4. import java.io.FileOutputStream; 5. import java.io.IOException; 6.<p>7. import javax.xml.parsers.DocumentBuilder;<p>8. import javax.xml.parsers.DocumentBuilderFactory;<p>9. import javax.xml.parsers.ParserConfigurationException; 10.import javax.xml.transform.Transformer;<p>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;<p>15.import javax.xml.transform.stream.StreamResult; 16.<p>17.import org.w3c.dom.Document; 18.import org.w3c.dom.Element;<p>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.<p>24.public class TestDOMWriter { 25.<p>26.public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException, TransformerException {<p>27.DocumentBuilderFactory dfb =<p>DocumentBuilderFactory.newInstance();<p>28.DocumentBuilder db = dfb.newDocumentBuilder(); 29.Document doc = db.parse(new<p>File(\"F:\\\\interlib\\\\myeclipseWS\\\\SyncReaderFramework\\\\src\\\est.xml\")); 30.<p>31.NodeList nodeList = doc.getElementsByTagName(\"title\"); 32.for (int i = 0; i < nodeList.getLength(); i++) { 33.Element ele = (Element)nodeList.item(i);<p>34.NamedNodeMap attributes = ele.getAttributes(); 35.for (int k = 0; k < attributes.getLength(); k++) {<p>36.System.out.println(\"Attribute:\"+attributes.item(i).getNodeValue()); 37.}<p>38.Node node = attributes.getNamedItem(\"name\"); 39.//设置NAME属性的值<p>40.node.setNodeValue(\"shun\");<p>41.System.out.println(\"Node Value:\"+node.getNodeValue()); 42.} 43. 44.} 45. 46.}<p>运行后我们看到结果<p>我们看到我们设置后的值已经改变了,也即是DOM树里面的值已经改变了。但有时我们并不只需要在内存里面改变值,而是需要写回到XML文件中。那我们应该怎么做呢?DocumentBuilderFactory并没有提供相应的方法,我们需要借助另外一系列类来进行实现,TransformerFactory,Transformer等。<p>2)写回XML<p>借助上面我们提到的类我们可以把DOM树的改变写回XML文件中:<p>Java代码<p>1. FileOutputStream fos = new<p>FileOutputStream(\"F:\\\\interlib\\\\myeclipseWS\\\\SyncReaderFramework\\\\src\\\est.xml\");<p>2. TransformerFactory tFactory = TransformerFactory.newInstance(); 3. Transformer trans = tFactory.newTransformer(); 4. DOMSource source = new DOMSource(doc);<p>5. StreamResult result = new StreamResult(fos); 6. trans.transform(source, result);<p>其实这时代码也是比较简单的,可能某些朋友看上去会比较害怕,因为好几个类都没见过。<p>其实代码总的来说也比较简单,流程比较清晰。 1、打开文件准备写入<p>2、通过工厂类创建Transformer<p>3、通过document对象构造DOMSource,也即是DOM结构<p>4、StreamResult可以理解为是写入的目标,上面的文件也即是为了在这时使用<p>5、写入XML文件<p>流程是比较简单,但估计写的时候还是比较麻烦的。毕竟不熟悉的东西。<p>我们把上面的代码全部综合一下,对我们刚开始的XML文件内容进行修改:<p>Java代码<p>1. public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException, TransformerException {<p>2. DocumentBuilderFactory dfb =<p>DocumentBuilderFactory.newInstance();<p>3. DocumentBuilder db = dfb.newDocumentBuilder(); 4. Document doc = db.parse(new<p>File(\"F:\\\\interlib\\\\myeclipseWS\\\\SyncReaderFramework\\\\src\\\est.xml\")); 5.<p>6. NodeList nodeList = doc.getElementsByTagName(\"title\"); 7. for (int i = 0; i < nodeList.getLength(); i++) { 8. Element ele = (Element)nodeList.item(i);<p>9. NamedNodeMap attributes = ele.getAttributes(); 10.for (int k = 0; k < attributes.getLength(); k++) {<p>11.System.out.println(\"Attribute:\"+attributes.item(i).getNodeValue()); 12.}<p>13.Node node = attributes.getNamedItem(\"name\"); 14.//设置NAME属性的值<p>15.node.setNodeValue(\"shun\");<p>16.System.out.println(\"Node Value:\"+node.getNodeValue()); 17.} 18.<p>19.//这里重要,写入XML文件 20.FileOutputStream fos = new<p>FileOutputStream(\"F:\\\\interlib\\\\myeclipseWS\\\\SyncReaderFramework\\\\src\\\est.xml\");<p>21.TransformerFactory tFactory = TransformerFactory.newInstance(); 22.Transformer trans = tFactory.newTransformer(); 23.DOMSource source = new DOMSource(doc);<p>24.StreamResult result = new StreamResult(fos); 25.trans.transform(source, result); 26.<p>27.System.out.println(\"Finished...\");<p>28.}<p>我们运行看到结果:<p>运行没问题,那再看看我们的test.xml,它的内容变成了:<p>我们的修改完成了。但它帮我们添加了standalone=\"no\",这个表示它不是单独的XML文件,有DTD定义,这个我们先不管,我们没有定义DTD。我们看到title中name属性的值已经被我们修改成功了。<p>很多人会习惯用DOM4J或jdom这些工具类,他们也很有用,但JDK有现成的,感觉就没必要让项目引用太多的JAR包了。<p> <div class="preview-ft"> <div class="preview-title"> <p style="color: red;"><strong>因篇幅问题不能全部显示,请点此查看更多更全内容</strong></p> <div class="model-fold-cover-bd"><a href="https://www.tang5.com/mluuea/nreoiisegku/" target="_blank"><span>查看全文</span><i class="iconfont icon-chakangengduo"></i></a></div> </div> </div> <script type="text/javascript" src="https://jss.dfix.cn/pc/wenzhang/detail_left.js"></script> </div> <div class="glfra_f"> </div> </div> <script type="text/javascript" src="https://jss.dfix.cn/pc/wenzhang/wenzhang/detail_foot.js"></script> <script type="text/javascript" src="https://jss.dfix.cn/pc/share_right_gg1.js"></script> <script type="text/javascript" src="https://jss.huatuo6.com/pc/share_right_xgzx.js"></script> <script type="text/javascript" src="https://jss.dfix.cn/pc/share_right_gg2.js"></script> <script type="text/javascript" src="https://jss.huatuo6.com/pc/share_right_rmyd.js"></script> </div> <div class="n_right"> <script type="text/javascript" src="https://jss.dfix.cn/pc/share_cebian_gg1.js"></script> <script type="text/javascript" src="https://jss.huatuo6.com/pc/share_cebian_rmht.js"></script> <script type="text/javascript" src="https://jss.dfix.cn/pc/share_cebian_gg2.js"></script> <script type="text/javascript" src="https://jss.huatuo6.com/pc/share_cebian_rmtw.js"></script> <script type="text/javascript" src="https://jss.dfix.cn/pc/share_cebian_gg3.js"></script> <script type="text/javascript" src="https://jss.huatuo6.com/pc/share_cebian_wntj.js"></script> </div> </div> <script type="text/javascript" src="https://jss.huatuo6.com/pc/tj_foot1.js"></script><div class="foot"> <div class="smain"> <div class="foot_ano clearfix"> <!-- <div class="foot_logo"> <img src="images/logo_w.png" alt="AI游中国" /> </div> --> <div class="foot_mesg"> <p> Copyright © 2019-<span class="currentYear"></span> dfix.cn 版权所有 <a href="https://beian.miit.gov.cn/" target="_blank" style="color:#fff">湘ICP备2024080961号-1</a> </p> <p> 违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com </p> <p> 本站由北京市万商天勤律师事务所王兴未律师提供法律服务 </p> </div> </div> </div> </div> <script type="text/javascript"> const currentYear = new Date().getFullYear(); $('.currentYear').html(currentYear) </script>