先从底层的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. Mybatis传多个参数(三种解决方案)

    http://blog.csdn.net/liangyihuai/article/details/49965869 (zhuan)

  2. DB2 常用命令小结

    . 打开命令行窗口 #db2cmd . 打开控制中心 # db2cmd db2cc . 打开命令编辑器 db2cmd db2ce =====操作数据库命令===== . 启动数据库实例 #db2sta ...

  3. Javascript 中判断对象为空

    发现了一个巧妙的实现: 需要检查一个对象(Object)是否为空,即不包含任何元素.Javascript 中的对象就是一个字典,其中包含了一系列的键值对(Key Value Pair).检查一个对象是 ...

  4. 渗透日记-利用SQLMAP伪静态注入

    今日找到一个网站,做下安全检测,url是这样的: 不是传统的.php结尾,所以很多人认为这个不能注入,其实伪静态也能注入的,这个url虽然做了伪静态,但是还是需要传递参数到数据库去查询的,试试能否注入 ...

  5. ArcGIS10.1 发布气温插值GP服务

    首先通过ModelBuilder 工具 构建模型 然后通过模块右键 设置输入参数 或者直接将一个模块设为输入参数 在输出模块的右键属性上 可以设置lyr文件用于渲染 设置数据添加到显示用于不是发布的时 ...

  6. PhpStorm提高效率的使用方法及设置

    快捷键: CTRL + D  复制当前行到下一行 或 复制选中内容到选中内容之后 CTRL + Y  删除当前行或选中内容所涉及的行 CTRL + R  替换 CTRL + F  查找 ALT + 上 ...

  7. ftp发送文件

    #!/bin/bash #author:luyongjin IP=220.250.65.22 USERNAME='ftp_hangye20' PASSWORD='oUo2JD7oK#u-epw' #D ...

  8. [已解决] java 增加 ALPN支持

    添加javaVM参数: -Xbootclasspath/p:lib/alpn-boot-8.1.10.v20161026.jar 文章来源:http://www.cnblogs.com/gifisan ...

  9. CSS3中毛玻璃效果的使用方法

    今天在使用icloud的时候看到苹果icloud官网的毛玻璃效果非常赞,仔细研究了一下它的实现方式,是使用js配合background-image: -webkit-canvas的形式绘制出的毛玻璃背 ...

  10. ftp协议详解

    客户端与服务器之间,需要多条连接才能完成应用的协议,属于复杂协议.如FTP,PPTP,H.323和SIP均属于复杂协议. 这里主要介绍ftp协议的工作原理.首先,ftp通信协议有两种工作模式,被动模式 ...