先從底層的xml操作技術(shù)記錄:
當(dāng)我們新建一個項(xiàng)目,什么架包都沒加入的時候,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來讀取xml、對xml進(jìn)行增刪改操作
如何讀取一個xml文件:
導(dǎo)包:
javax.xml.parsers.DocumentBuilderFactory;//文本建造工廠
javax.xml.parsers.DocumentBuilder; //文本建造者
org.w3c.dom.Document; //文本
DocumentBuilderFactory factory=null;
DocumentBuilder builder=null;
Document doc=null;
try { factory=DocumentBuilderFactory.newInstance(); builder=factory.newDocumentBuilder(); doc=builder.parse("練習(xí)/上面的代碼:從工廠new一個文本建造者,由這個建造者去拿xml文件,n(*≧▽≦*)n太面向?qū)ο罅耍?/p>
獲取xml里面的節(jié)點(diǎn),以及節(jié)點(diǎn)內(nèi)的元素
Element對象提供一系列的方法,可以對節(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() 見名知意:
- element.getTagName()..... //獲取節(jié)點(diǎn)名字
方法很多,不一一介紹,上面的代碼中有體現(xiàn)!
需要注意的是:以上方法都是在內(nèi)存中執(zhí)行的,也就是在本地拿到東西后放在內(nèi)存里面,下面我們來了解增刪改時,對于多出來的操作就不覺得奇怪的
新增節(jié)點(diǎn):
新增節(jié)點(diǎn)使用document.createElement("")方法:
//在內(nèi)存中對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;
TransformerFactory tfactory=TransformerFactory.newInstance(); Transformer trans=tfactory.newTransformer(); //源 位置 Source source=new DOMSource(doc); Result result=new StreamResult(path); trans.transform(source, result);
n(*≧▽≦*)n也是面向?qū)ο螅?/p>
友情提示:
在添加節(jié)點(diǎn)的時候大家一定注意節(jié)點(diǎn)之間的關(guān)系,在持久化操作的時候,source對象里面應(yīng)該設(shè)置document對象,別設(shè)置成element對象
現(xiàn)在是初步學(xué)習(xí),沒遇到什么錯,我相信在后面的學(xué)習(xí)中會遇到更多問題,到時候補(bǔ)充
刪除、修改:
與新增操作雷同,最后一定要"trans.transform(source, result)"
不然你之前的代碼就都白費(fèi)了!
下面是重頭戲dom4j:
dom4j是一個Java的XML API,類似于jdom,用來讀寫XML文件的。dom4j是一個十分優(yōu)秀的JavaXML API,具有性能優(yōu)異、功能強(qiáng)大和極其易使用的特點(diǎn),同時它也是一個開放源代碼的軟件,可以在SourceForge上找到它。在IBM developerWorks上面還可以找到一篇文章,對主流的Java XML API進(jìn)行的性能、功能和易用性的評測,所以可以知道dom4j無論在哪個方面都是非常出色的。如今可以看到越來越多的Java軟件都在使用dom4j來讀寫XML,特別值得一提的是連Sun的JAXM也在用dom4j。這已經(jīng)是必須使用的jar包, Hibernate也用它來讀寫配置文件。
友情提示:
了解了底層的xml操作,dom4j操作就直接上代碼,原理其實(shí)一樣的。里面的方法名會有些區(qū)別,看看幫助文檔都可以解決
需要下載dom4j架包:
官網(wǎng)地址:http://sourceforge.net/projects/dom4j/files/
導(dǎo)入:import org.dom4j.*;
- 查
public List sele(String path) throws Exception{ Element element=CreateUtil.reElement(path); System.out.println("總共有:"+element.nodeCount()+"個元素"); list=new ArrayList(); //map=new HashMap(); return forhelper(element); }/** * 循環(huán)遍歷并且返回list * @param ele * @return */ public List forhelper(Element ele){ for(Iterator ite2=ele.elementIterator();ite2.hasNext();){ Element ele2=(Element)ite2.next(); //System.out.println(ele2.getName()+":"+ele2.getText()); String Word=ele2.getName()+":"+ele2.getText(); list.add(word); if(ele2.nodeCount()>0){ forhelper(ele2); } } return list; }- 增
/** * 保存指定的document對象,指定將要存儲的位置,gotopath=null時默認(rèn)存儲在打開的位置 * @param path * @param dom * @param goToPath * @return * @throws Exception */ public boolean save(String goToPath) throws Exception{ //創(chuàng)建document Document 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("沒有你要查找的節(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在持久化操作時會有亂碼的現(xiàn)象!
小竅門:
醬紫持久化就不會出現(xiàn)亂碼了!
OutputFormat output=OutputFormat.createPrettyPrint(); output.setEncoding("utf-8"); xmlw=new XMLWriter(new FileOutputStream(new File(path)), output); xmlw.write(dom);
代碼不一定合理,請不要照搬!
新聞熱點(diǎn)
疑難解答
圖片精選