Strus2第一次课:dom4j操作xml
先從底層的xml操作技術(shù)記錄:
當(dāng)我們新建一個(gè)項(xiàng)目,什么架包都沒(méi)加入的時(shí)候,java提供了 org.w3c.dom給我們操作xml里面的元素
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
并且提供了?javax.xml來(lái)讀取xml、對(duì)xml進(jìn)行增刪改操作
?
如何讀取一個(gè)xml文件:
導(dǎo)包:
DocumentBuilderFactory factory=null;
DocumentBuilder builder=null;
Document doc=null;
try {factory=DocumentBuilderFactory.newInstance();builder=factory.newDocumentBuilder();doc=builder.parse("練習(xí)/project1/Student2.xml");} catch (Exception e) {e.printStackTrace();}
上面的代碼:從工廠(chǎng)new一個(gè)文本建造者,由這個(gè)建造者去拿xml文件,n(*≧▽≦*)n太面向?qū)ο罅?#xff01;
?
獲取xml里面的節(jié)點(diǎn),以及節(jié)點(diǎn)內(nèi)的元素
Element對(duì)象提供一系列的方法,可以對(duì)節(jié)點(diǎn)執(zhí)行增、刪、改、查:
factory=DocumentBuilderFactory.newInstance();builder=factory.newDocumentBuilder();doc=builder.parse("練習(xí)/Student.xml");//element=build("練習(xí)/project1/Student2.xml").getDocumentElement();Element element=doc.getDocumentElement();
System.out.println("-------"+element.getTagName()+"-------");NodeList list=element.getElementsByTagName("student");for(int i=0;i<list.getLength();i++){for(int j=0;j<list.item(i).getChildNodes().getLength();j++){System.out.println(((Element)list.item(i).getChildNodes().item(j)).getNodeName()+":"+((Element)list.item(i).getChildNodes().item(j)).getTextContent());}System.out.println("--------------");}
上面的代碼打印xml里面的節(jié)點(diǎn)和節(jié)點(diǎn)內(nèi)的文本!
element接口里面的部分方法:
- element.getAttribute(""); ? ? ? ? ? ? ? ? ??//獲取節(jié)點(diǎn)屬性的
- element.getElementsByTagName(""); ?//根據(jù)節(jié)點(diǎn)名或者節(jié)點(diǎn)列表 NodeList
- element.getChildNodes()、element.getFirstNode()、element.getNextSibling()、element.getLastNode() ? ? 見(jiàn)名知意:
- element.getTagName()..... ? ? ? ? ? ? ? ? //獲取節(jié)點(diǎn)名字
方法很多,不一一介紹,上面的代碼中有體現(xiàn)!
?
?
需要注意的是:以上方法都是在內(nèi)存中執(zhí)行的,也就是在本地拿到東西后放在內(nèi)存里面,下面我們來(lái)了解增刪改時(shí),對(duì)于多出來(lái)的操作就不覺(jué)得奇怪的
新增節(jié)點(diǎn):
新增節(jié)點(diǎn)使用document.createElement("")方法:
?
//在內(nèi)存中對(duì)xml新增節(jié)點(diǎn):僅是在內(nèi)存中element=build("練習(xí)/project1/Student2.xml").getDocumentElement();Element creELe=doc.createElement("student");Element stuno=doc.createElement("stuno");Element stuname=doc.createElement("stuname");stuname.setTextContent("大頭");Element stuage=doc.createElement("stuage");stuage.setTextContent("20");Element stuinfo=doc.createElement("stuinfo");stuinfo.setTextContent("我的特點(diǎn)就是頭特別大!");stuno.setAttribute("id","2");creELe.appendChild(stuno);creELe.appendChild(stuname);creELe.appendChild(stuage);creELe.appendChild(stuinfo);element.appendChild(creELe);?
以上操作皆是內(nèi)存里面的操作,要將節(jié)點(diǎn)保存還需要持久化:
-
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
n(*≧▽≦*)n也是面向?qū)ο?#xff01;
友情提示:
在添加節(jié)點(diǎn)的時(shí)候大家一定注意節(jié)點(diǎn)之間的關(guān)系,在持久化操作的時(shí)候,source對(duì)象里面應(yīng)該設(shè)置document對(duì)象,別設(shè)置成element對(duì)象
現(xiàn)在是初步學(xué)習(xí),沒(méi)遇到什么錯(cuò),我相信在后面的學(xué)習(xí)中會(huì)遇到更多問(wèn)題,到時(shí)候補(bǔ)充
?
刪除、修改:
?與新增操作雷同,最后一定要"trans.transform(source, result)"
不然你之前的代碼就都白費(fèi)了!
下面是重頭戲dom4j:
?
?
dom4j是一個(gè)Java的XML API,類(lèi)似于jdom,用來(lái)讀寫(xiě)XML文件的。dom4j是一個(gè)十分優(yōu)秀的JavaXML API,具有性能優(yōu)異、功能強(qiáng)大和極其易使用的特點(diǎn),同時(shí)它也是一個(gè)開(kāi)放源代碼的軟件,可以在SourceForge上找到它。在IBM developerWorks上面還可以找到一篇文章,對(duì)主流的Java XML API進(jìn)行的性能、功能和易用性的評(píng)測(cè),所以可以知道dom4j無(wú)論在哪個(gè)方面都是非常出色的。如今可以看到越來(lái)越多的Java軟件都在使用dom4j來(lái)讀寫(xiě)XML,特別值得一提的是連Sun的JAXM也在用dom4j。這已經(jīng)是必須使用的jar包, Hibernate也用它來(lái)讀寫(xiě)配置文件。
友情提示:
了解了底層的xml操作,dom4j操作就直接上代碼,原理其實(shí)一樣的。里面的方法名會(huì)有些區(qū)別,看看幫助文檔都可以解決
需要下載dom4j架包:
官網(wǎng)地址:http://sourceforge.net/projects/dom4j/files/
導(dǎo)入:import org.dom4j.*;
?
- 查
?
- 增
?
/*** 保存指定的document對(duì)象,指定將要存儲(chǔ)的位置,gotopath=null時(shí)默認(rèn)存儲(chǔ)在打開(kāi)的位置* @param path* @param dom* @param goToPath* @return* @throws Exception*/public boolean save(String goToPath) throws Exception{//創(chuàng)建documentDocument dom=DocumentHelper.createDocument();//創(chuàng)建根節(jié)點(diǎn) Element eleRoot=dom.addElement("Student");Element ele=eleRoot.addElement("stuno").addText("1");Element ele2=eleRoot.addElement("stuname").addText("李四");last(dom, goToPath);return false;}
- 改
/*** 改變文本內(nèi)容* @param path* @param goToPath* @return* @throws Exception*/public boolean reEle(String path,String goToPath) throws Exception{Document dom=CreateUtil.redom(path);Element element= dom.getRootElement();System.out.println(element.getName());Element ele=element.element("stuname");System.out.println(ele.asXML());ele.setText("改變了"); last(dom, goToPath);return false;}
- 刪
/*** 刪除制定的節(jié)點(diǎn),或者節(jié)點(diǎn)內(nèi)元素* @param path* @return* @throws Exception*/public boolean del(String path,String elename) throws Exception{Document dom=CreateUtil.redom(path);Element element= dom.getRootElement();System.out.println(element.getName());Element ele=element.element(elename);if(ele!=null){System.out.println(ele.asXML());System.out.println(element.remove(ele)); last(dom, path);}else{System.out.println("沒(méi)有你要查找的節(jié)點(diǎn)!");}return false;}
- 持久化方法
/*** 從內(nèi)存讀取到本地* @param dom* @param path*/public void last(Document dom,String path){XMLWriter xmlw=null;try {OutputFormat output=OutputFormat.createPrettyPrint();output.setEncoding("utf-8");xmlw=new XMLWriter(new FileOutputStream(new File(path)), output);xmlw.write(dom);} catch (Exception e) {e.printStackTrace();}finally{if(xmlw!=null){try {xmlw.close();System.out.println("操作成功!");} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}}}}
?
注意::
dom4j在持久化操作時(shí)會(huì)有亂碼的現(xiàn)象!
小竅門(mén):
醬紫持久化就不會(huì)出現(xiàn)亂碼了!
OutputFormat output=OutputFormat.createPrettyPrint();output.setEncoding("utf-8");xmlw=new XMLWriter(new FileOutputStream(new File(path)), output);xmlw.write(dom); ?
代碼不一定合理,請(qǐng)不要照搬!
轉(zhuǎn)載于:https://www.cnblogs.com/gcs1995/p/4204578.html
總結(jié)
以上是生活随笔為你收集整理的Strus2第一次课:dom4j操作xml的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ubuntu源列表(清华,阿里,官方,选
- 下一篇: Cacti添加IO模板并监控磁盘IO