先从底层的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文件:

  导包:

  1. javax.xml.parsers.DocumentBuilderFactory;//文本建造工厂

  2. javax.xml.parsers.DocumentBuilder;      //文本建造者

  3. 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=;i<list.getLength();i++){
for(int j=;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("");  //根据节点名或者节点列表 NodeList
  • element.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);
 

  

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

 

Strus2第一次课:dom4j操作xml的更多相关文章

  1. xml解析 使用dom4j操作xml

     使用dom4j操作xml 1 导入 dom4j,的jar包   2 指定要解析的XML文件 SAXReader sr=new SAXReader(); Document document= sr.r ...

  2. DOM4J操作XML(包括封装和解析)

    DOM4J操作XML(包括封装和解析) 先来看看dom4j中相应XML的DOM树建立的继承关系 针对于XML标准定义.相应于图2-1列出的内容,dom4j提供了下面实现: 以下给出一个详细事例: pa ...

  3. Strus2第一次课:dom4j解析xml文档

    xml文本标记语言: 常用于交换数据:独立于操作系统.编程语言数据存储:xml数据配置:灵活性强,可读性高可以使用css样式改变xml样式 xml解析技术:dom解析xml技术: sax解析xml技术 ...

  4. 使用dom4j操作XML

    DOM4J介绍 DOM4J是使用Java语言编写的,用于读写及操作XML的一套组件,DOM4J同时具有DOM修改文件的优点和SAX读取快速的优点. DOM4J的使用 首先下载dom4j的JAR包,我用 ...

  5. XML学习笔记(2)--dom4j操作XML

    1. 介绍(四种方式的比较这部分转载自:http://www.blogjava.net/xcp/archive/2010/02/12/312617.html) 1)DOM(JAXP Crimson解析 ...

  6. dom4j操作xml文档

    java Dom4j解析XML文件 标签(空格分隔):java进阶 xml文档: <?xml version="1.0" encoding="UTF-8" ...

  7. 使用Dom4j操作XML数据

    --------------siwuxie095                             dom4j 是一个非常优秀的 Java XML 的 API, 用来读写 XML 文件 和操作 ...

  8. dom4j操作xml

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件.是一个非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源工具.可以在这个 ...

  9. dom4j操作xml对象

         // 获取Documen对象      public static Document getDocument(String path) throws Exception{           ...

随机推荐

  1. sql server 数据库 日期格式转换

    日期时间转字符串:Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM Select CONVERT(varchar(100), ...

  2. Android touch 事件传递机制

    前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事 ...

  3. 如何使用iTunes与iTools导出微信聊天记录

    .tocblock .tocblock .tocblock { margin-left: 2.25em; } .madoko .toc>.tocblock .tocblock { margin- ...

  4. Java Web开发中MVC设计模式简介

    一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条 ...

  5. 亲手使用Sencha Touch + phonepag开发Web APP随笔 -- 环境安装篇

    最近因为有个项目需要制作APP,考虑到需要兼容Android和IOS,所以想采用WebAPP的方式来开发.现在是从零开始学习之路,走起-   通过网上博客和论坛,开始安装了一堆软件: 1. Sench ...

  6. paper

    1 IR 小目标检测 “Learning to detect small target A local kernel method” Xie K, Zhou T, Qiao Y, et al. Lea ...

  7. 51单片机tea5767收音机 红外遥控 自动搜台 存台 DIY

    先看效果图: 显示 频道CH , 频率 100.0Mhz 欢迎信息,1602 内置日文平假名, 正好用来显示博主名称. 焊接前,已经万能面包板上试验成功. 焊接完成以后,1602 的D0 - D7 接 ...

  8. session原理及实现共享

    一.session的本质http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你.那么,在一些场合,确实需要服务器记住当前用户怎么办?比如用户登录邮箱 ...

  9. 电脑装的是office2013,右键新建却是2007,或者右键新建菜单中没有excel2013问题解决办法。

    我的office出现了两个问题,因为工作比较忙,也没有着急解决,今天实在受不了了,花费一下午才找到解决方法. 原来万恶之源都是可恶的wps,以后千万不安装kingsoft了. 第一个问题:excel打 ...

  10. IOS 创建渐变图层

    代码如下 typedef enum { GradientLayerKindLeftRight = , GradientLayerKindUpDown, GradientLayerKindLBRT,// ...