Strus2第一次课:dom4j操作xml

王朝学院·作者佚名  2016-05-28
窄屏简体版  字體: 小  |  中  |  大  |  超大  

Strus2第一次课:dom4j操作xml先从底层的xml操作技术记录:

当我们新建一个项目,什么架包都没加入的时候,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进行增删改操作

如何读取一个xml文件:

导包:

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("练习/PRoject1/Student2.xml"); } catch (Exception e) { e.printStackTrace(); }

上面的代码:从工厂new一个文本建造者,由这个建造者去拿xml文件,n(*≧▽≦*)n太面向对象了!

获取xml里面的节点,以及节点内的元素

Element对象提供一系列的方法,可以对节点执行增、删、改、查:

factory=DocumentBuilderFactory.newInstance(); builder=factory.newDocumentBuilder(); doc=builder.parse("练习/Student.xml"); //element=build("练习/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里面的节点和节点内的文本!

element接口里面的部分方法:

element.getAttribute(""); //获取节点属性的element.getElementsByTagName(""); //根据节点名或者节点列表 NodeListelement.getChildNodes()、element.getFirstNode()、element.getNextSibling()、element.getLastNode() 见名知意:element.getTagName()..... //获取节点名字方法很多,不一一介绍,上面的代码中有体现!

需要注意的是:以上方法都是在内存中执行的,也就是在本地拿到东西后放在内存里面,下面我们来了解增删改时,对于多出来的操作就不觉得奇怪的

新增节点:

新增节点使用document.createElement("")方法:

//在内存中对xml新增节点:仅是在内存中 element=build("练习/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("我的特点就是头特别大!"); stuno.setAttribute("id","2"); creELe.appendChild(stuno); creELe.appendChild(stuname); creELe.appendChild(stuage); creELe.appendChild(stuinfo); element.appendChild(creELe);

以上操作皆是内存里面的操作,要将节点保存还需要持久化:

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也是面向对象!

友情提示:

在添加节点的时候大家一定注意节点之间的关系,在持久化操作的时候,source对象里面应该设置document对象,别设置成element对象

现在是初步学习,没遇到什么错,我相信在后面的学习中会遇到更多问题,到时候补充

删除、修改:

与新增操作雷同,最后一定要"trans.transform(source, result)"

不然你之前的代码就都白费了!

下面是重头戏dom4j:

dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。

友情提示:

了解了底层的xml操作,dom4j操作就直接上代码,原理其实一样的。里面的方法名会有些区别,看看帮助文档都可以解决

需要下载dom4j架包:

官网地址:http://sourceforge.net/projects/dom4j/files/

导入: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); }/** * 循环遍历并且返回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时默认存储在打开的位置 * @param path * @param dom * @param goToPath * @return * @throws Exception */ public boolean save(String goToPath) throws Exception{ //创建document Document dom=DocumentHelper.createDocument(); //创建根节点 Element eleRoot=dom.addElement("Student"); Element ele=eleRoot.addElement("stuno").addText("1"); Element ele2=eleRoot.addElement("stuname").addText("李四"); last(dom, goToPath); return false; }

改

/** * 改变文本内容 * @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; }

删

/** * 删除制定的节点,或者节点内元素 * @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("没有你要查找的节点!"); } return false; }

持久化方法

/** * 从内存读取到本地 * @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在持久化操作时会有乱码的现象!

小窍门:

酱紫持久化就不会出现乱码了!

OutputFormat output=OutputFormat.createPrettyPrint(); output.setEncoding("utf-8"); xmlw=new XMLWriter(new FileOutputStream(new File(path)), output);xmlw.write(dom);

代码不一定合理,请不要照搬!

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航