`
guoc
  • 浏览: 29997 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

dom4j xml文件读写

阅读更多

 

本文档包含四个部分:

<!-- [if !supportLists]-->Ø        <!-- [endif]--> XML 示例

<!-- [if !supportLists]-->Ø        <!-- [endif]-->修改 XML

<!-- [if !supportLists]-->Ø        <!-- [endif]--> XML 示例

<!-- [if !supportLists]-->Ø        <!-- [endif]-->任务描述:使用递归 , 完成对任何 xml 文件的读取

 

 

写文件示例:

/**

  任务描述:使用JAVA 程序输出下面的xml 文档:class.xml

 

    <?xml version="1.0" encoding="GBK"?>

   

    <root year="2008">

      <boss> 带头大哥 </boss>

      <class id="01" teacher=" 张三"> 一班 </class>

      <class id="02" teacher=" 李四"> 二班 </class>

      <class id="03" teacher=" 张三丰"> 三班 </class>

    </root>

  */

package chapter12.dom4j;

 

import java.io.FileWriter;

import org.dom4j.Document;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

import org.dom4j.io.OutputFormat;

import org.dom4j.io.XMLWriter;

 

public class WriteDemo {

 

    public static void main(String[] args) throws Exception {

        // 创建文档对象

        Document doc = DocumentHelper.createDocument ();

       

        // 创建根节点 <lovo></lovo>

        Element root = doc.addElement( "root" );

       

        // 增加属性节点  <root year="2008"></root>

        root.addAttribute( "year" , "2008" );

        root.addElement( "boss" ).addText( " 带头大哥" );

       

        // 增加带属性和文本的子节点  <class id="01" teacher=" 张三"> 一班</class>

        root.addElement( "class" ).addAttribute( "id" , "01" ).addAttribute( "teacher" , " 张三" ).addText( " 一班" );

        root.addElement( "class" ).addAttribute( "id" , "02" ).addAttribute( "teacher" , " 李四" ).addText( " 二班" );

        root.addElement( "class" ).addAttribute( "id" , "03" ).addAttribute( "teacher" , " 张三丰" ).addText( " 三班" );

       

        // 保存( 指定编码)

        FileWriter out1 = new FileWriter( "class.xml" );

       

       

        OutputFormat format = OutputFormat.createPrettyPrint (); //createCompactFormat,createPrettyPrint

        format.setEncoding( "GBK" ); 

       

        XMLWriter  out2 = new XMLWriter(out1,format); // 指定格式

       

        out2.write(doc);

        out2.close();

    }

   

}

 

修改文件示例:

/**

  * 任务描述:将下面class.xmlid=02 的节点中的文本改为“项目二部”,teacher 改为“带头大哥”

   <?xml version="1.0" encoding="GBK"?>

    <root year="2008">

      <boss> 带头大哥 </boss>  

      <class id="01" teacher=" 张三"> 一班 </class>  

      <class id="02" teacher=" 李四"> 二班 </class>  

      <class id="03" teacher=" 张三丰"> 三班 </class>

    </root>

  */

package chapter12.dom4j;

 

import java.io.File;

import java.io.FileInputStream;

import java.io.FileWriter;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.util.List;

 

import org.dom4j.Document;

import org.dom4j.DocumentException;

import org.dom4j.Element;

import org.dom4j.io.OutputFormat;

import org.dom4j.io.SAXReader;

import org.dom4j.io.XMLWriter;

 

public class ModifyDemo {

 

   

    public static void main(String[] args) throws Exception {

        StringBuffer sb = new StringBuffer();

 

        SAXReader reader = new SAXReader();

 

        // 得到文档对象

        Document doc = null ;

        try {

            // 指定编码, 避免出现

            InputStream isr = new FileInputStream ( new File ( "class.xml" ));

            doc = reader.read( new InputStreamReader(isr, "GBK" ));

            isr.close();

        } catch (DocumentException e) {

            e.printStackTrace();

        }

 

          // 使用XPATH 表达式获得节点列表

        List<Element> list = doc.selectNodes( "//root/class" );

        // 创建一个迭代器.

        for (Element ele:list){

        String id = ele.valueOf( "@id" );

       

        if (id!= null && id.equals( "02" )){

             ele.setText( " 项目二部" );

             ele.setAttributeValue( "teacher" , " 带头大哥" );

        }

        }

       

        // 保存( 指定编码)

        FileWriter out1 = new FileWriter( "class.xml" );

       

        OutputFormat format = OutputFormat.createPrettyPrint ();

        format.setEncoding( "GBK" ); 

       

        XMLWriter  out2 = new XMLWriter(out1,format); // 指定格式

       

        out2.write(doc);

        out2.close();       

    }

}

 

读文件示例:

/**

  * 读取class.xml, 内容如下:

    <?xml version="1.0" encoding="GBK"?>

    <root year="2008">

      <boss> 带头大哥 </boss>

      <class id="01" teacher=" 张三"> 一班 </class>

      <class id="02" teacher=" 李四"> 二班 </class>

      <class id="03" teacher=" 张三丰"> 三班 </class>

    </root>

   

** 要求输出以下内容:

    根节点:root

    class= 一班   id = 01   teacher = 张三 year=2008

    class= 二班   id = 02   teacher = 李四 year=2008

    class= 三班   id = 03   teacher = 张三丰 year=2008

   

    teacher= 张三

    teacher= 李四

    teacher= 张三丰

  */

 

package chapter12.dom4j;

 

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.util.List;

 

import org.dom4j.Attribute;

import org.dom4j.Document;

import org.dom4j.DocumentException;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

 

public class ReadDemo {

 

    public static void main(String[] args) throws Exception {

        StringBuffer sb = new StringBuffer();

 

        SAXReader reader = new SAXReader();

 

        // 得到文档对象

        Document doc = null ;

        try {

            // 指定编码, 避免出现

            InputStream isr = new FileInputStream ( new File ( "class.xml" ));

            doc = reader.read( new InputStreamReader(isr, "GBK" ));

            isr.close();

        } catch (DocumentException e) {

            e.printStackTrace();

        }

 

        // 获取根节点

        Element eleRoot = doc.getRootElement();

        System. out .println( " 根节点:" +eleRoot.getName());

       

        // 获取指定路径中的( 多个) 节点

        List<Element> listClass = doc.selectNodes( "//root/class" );

        for ( int i = 0; i < listClass.size(); i++) {

            // 获取当前节点

            Element ele = listClass.get(i);

           

            // 获取当前节点的 名称和文本

            sb.append(ele.getName() + "=" + ele.getText());

           

            // 获取属性值

            sb.append( "  id = " +ele.valueOf( "@id" ));

            sb.append( "  teacher = " +ele.valueOf( "@teacher" ));

           

            // 获取父节点 ( 文本、属性……)

            sb.append( " year" + "=" + ele.getParent().valueOf( "@year" )+ " \r" );

        }

       

        System. out .println(sb.toString());

       

        // 演示:获取指定路径中的( 多个) 属性

        List<Attribute> list = doc.selectNodes( "//root/class/@teacher" );       

//      for(int i=0;i<list.size();i++){

//          Attribute att = list.get(i);

//          System.out.println(att.getName()+"="+att.getValue());

//      }

       

        // 使用JDK1.5 中的for each 循环完成上面代码的功能( 对比学习)

       

        for (Attribute att:list){

            System. out .println(att.getName()+ "=" +att.getValue());          

        }

 

    }

 

}

 

递归读示例:

/**
 * 任务描述:使用递归,完成对任何xml文件的读取
 */
package xml.dom4j;

import java.io.File;
import java.util.Iterator;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class ReadDiGui {

    public static void main(String[] args) {
        ReadDiGui dr = new ReadDiGui();
        dr.prinatAllNode();
    }

    public void prinatAllNode() {
        SAXReader reader = new SAXReader();

        // 得到文档对象
        Document doc = null;
        try {
            doc = reader.read(new File("class.xml"));
        } catch (DocumentException e) {
            e.printStackTrace();
        }

        // 得到根节点
        Element root = doc.getRootElement();

        // 循环所有节点
        printAllChildNode(root);
    }
   
    /**
     * 打印所有子节点
     */
    public void printAllChildNode(Element element) {
        // 循环当前节点的所有属性
        Iterator j =  element.attributeIterator();
        while (j.hasNext()) {
            Attribute attribute = (Attribute) j.next();
            System.out.println("    "
                    +attribute.getName()
                    + " = "
                    + attribute.getText());
        }
       
        for (int i = 0, size = element.nodeCount(); i < size; i++) {
            Node node = element.node(i);
            if (node instanceof Element) {
                System.out.println(
                        node.getName()
                        + " = "
                        + node.getText());
               
                printAllChildNode((Element) node);//自己调用自己--递归
            }
        }
    }   
}
===========================

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://lavasoft.blog.51cto.com/62575/347348
<!-- 正文 begin-->
Dom4j格式化转义字符问题
 
1、不得不说的XML CDATA部件
 
在XML文档中的所有文本都会被解析器解析。
 
只有在CDATA部件之内的文本会被解析器忽略。
 
不合法的XML字符必须被替换为相应的实体。
 
如果在XML文档中使用类似"<" 的字符, 那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始。
 
&lt; < 小于号
&gt; > 大于号
&amp; &
&apos; ' 单引号
&quot; " 双引号

实体必须以符号"&"开头,以符号";"结尾。
注意: 只有"<" 字符和"&"字符对于XML来说是严格禁止使用的。剩下的都是合法的,为了减少出错,使用实体是一个好习惯。

CDATA部件
在CDATA内部的所有内容都会被解析器忽略。
如果文本包含了很多的"<"字符和"&"字符——就象程序代码一样,那么最好把他们都放到CDATA部件中。
一个 CDATA 部件以"<![CDATA[" 标记开始,以"]]>"标记结束:

CDATA注意事项:
CDATA部件之间不能再包含CDATA部件(不能嵌套)。如果 CDATA部件包含了字符"]]>" 或者"<![CDATA[" ,将很有可能出错哦。
同样要注意在字符串"]]>"之间没有空格或者换行符。
 
2、Dom4j格式化转义字符问题
 
person.xml
<? xml version ="1.0" encoding ="UTF-8" ?>
< person >
        < name > 张三</ name >
        < addr > <![CDATA[经三路< 鑫苑 > 19F]]></ addr >
</ person >
 
上面的XML在被Dom4j格式化的时候,自动会被转义,转义后的内容如下:
<?xml version="1.0" encoding="GBK"?>
<person>
  <toname>&lt;![CDATA[经三路&lt;鑫 苑&gt;19F]]&gt;</toname>
</person>
 
这样,显然不是想要的结果,因为CDATA不需要再转义了。如何处理该问题,看下面的程序的处理:
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import java.io.IOException;
import java.io.StringWriter;
import java.util.Date;

/**
* Created by IntelliJ IDEA.
*
* @author leizhimin 2010-7-10 16:03:39
*/

public class Person {
        private String name;
        private String addr;

        public Person(String name, String addr) {
                this .name = name;
                this .addr = addr;
        }

        public static void main(String[] args) {
                Person p = new Person("张三" , "经三路<鑫苑>19F" );
                p.showXml();
        }

        public void showXml() {
                String xml1, xml2, xml3;
                Document doc = DocumentHelper.createDocument();
                doc.setXMLEncoding("GBK" );
                Element root = doc.addElement("person" );
                if (addr != null )
                        addElement(root, "toname" , "<![CDATA[" + this .addr + "]]>" );
                else
                        addElement(root, "toname" , this .addr);

                xml1 = doc.asXML();                                        //默认转义
                xml2 = formatXml(doc, "GBK" , true );        //转义
                xml3 = formatXml(doc, "GBK" , false );     //不转义
                System.out.println(xml1);
                System.out.println("-------------------------" );
                System.out.println(xml2);
                System.out.println("-------------------------" );
                System.out.println(xml3);
        }

        /**
         * 在指定的元素下添加一个新的子元素
         *
         * @param e         父元素
         * @param name    子元素名
         * @param value 子元素值
         * @return 新加子元素
         */

        public static Element addElement(Element e, String name, Object value) {
                Element x = e.addElement(name);
                if (value == null || "".equals(value.toString().trim())) {
                        x.setText("");
                } else if (value instanceof Date) {
                        x.setText(DateToolkit.toISOFormat((Date) value));
                } else {
                        x.setText(value.toString());
                }
                return x;
        }

        /**
         * 格式化XML文档
         *
         * @param document xml文档
         * @param charset    字符串的编码
         * @param istrans    是否对属性和元素值进行转移
         * @return 格式化后XML字符串
         */

        public static String formatXml(Document document, String charset, boolean istrans) {
                OutputFormat format = OutputFormat.createPrettyPrint();
                format.setEncoding(charset);
                StringWriter sw = new StringWriter();
                XMLWriter xw = new XMLWriter(sw, format);
                xw.setEscapeText(istrans);
                try {
                        xw.write(document);
                        xw.flush();
                        xw.close();
                } catch (IOException e) {
                        System.out.println("格式化XML文档发生异常,请检查!" );
                        e.printStackTrace();
                }
                return sw.toString();
        }
}
 
输出结果:
<?xml version="1.0" encoding="GBK"?>
<person><toname>&lt;! [CDATA[经三路&lt;鑫苑&gt;19F]]&gt;</toname></person>
-------------------------
<?xml version="1.0" encoding="GBK"?>
<person>
  <toname>&lt;![CDATA[经三路&lt;鑫 苑&gt;19F]]&gt;</toname>
</person>
-------------------------
<?xml version="1.0" encoding="GBK"?>
<person>
  <toname><![CDATA[经三路<鑫苑>19F]]></toname>
</person>

Process finished with exit code 0
 
可以看出,最后一种输出是真正想要的结果。
 
因此,要控制转义的问题,必须对XML重新格式化,格式化的时候,需要设置:
        xw.setEscapeText(false);

本文出自 “熔 岩 ” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/347348

分享到:
评论

相关推荐

    dom4j读写xml文档实例

    要使用DOM4J读取XML文档,首先需要创建一个`SAXReader`对象,然后调用`read`方法传入XML文件路径。这将返回一个`Document`对象,我们可以从中获取所有元素信息。 ```java File file = new File("path_to_xml_file")...

    读写超大类xml文件,使用dom4j读写xml文件的工具类

    基于dom4j的读写xml文件的工具包。封装了dom4j操作xml文档的常和方法。 支持两种读写方法。1:针对小文件的读取整个文档,2:针对大文件的,逐行读取。读到几百M文件毫无压力。

    dom4j关于xml读写的例子里面还有dom4j的jar包

    除了基本的读写操作,DOM4J还支持XPath查询,这是一种强大的定位XML元素的方式。通过`XPathExpression`和`XPathFactory`,你可以编写XPath表达式来查找XML文档中的特定节点。例如,`//elementName`可以匹配所有名为`...

    dom4j_XML.rar_DOM4J_dom4j xml java_java xml_读写xml

    例子比较简单”的描述中,我们可以推断出这个压缩包包含了一些关于如何使用DOM4J进行XML读写的基本示例。以下是对这些关键知识点的详细解释: 1. **XML解析**:DOM4J支持两种解析XML文档的方式:SAX(Simple API ...

    dom4j读写xml文件

    在你的`analysisXml`示例中,很可能是通过DOM4J库读取了一个名为`dom4j.xml`的文件,分析其结构,提取或修改数据,然后再将结果写回新的XML文件。这个过程可能包括获取特定元素、遍历元素树、修改属性值,甚至可能...

    使用dom4j对xml的读写

    **使用DOM4J对XML的读写** DOM4J是一个非常强大的Java库,专门用于处理XML文档。它提供了丰富的API,使得XML的读取、创建、修改和解析变得简单易行。相较于JDOM,DOM4J确实提供了更多的功能,虽然在学习曲线方面...

    dom4j解析xml详解

    DOM4J的核心优势之一在于其丰富的接口体系,这些接口定义在`org.dom4j`包内,提供了对XML文档进行读写、查询、修改等操作的能力。 1. **Attribute**: 代表XML中的属性,可用于获取和设置属性值。 2. **Branch**: ...

    dom4j 解析(读取) xml 节点数据

    DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了简单而直观的方式来解析、创建、修改和操作XML数据。在本教程中,我们将深入探讨如何使用DOM4J...在实际项目中,DOM4J常被用于数据交换、配置文件读写等场景。

    DOM4J jar包 xml解析 所有的dom4j-1.6.1 dom4j-2.0.2 dom4j-2.1.1包 导入直接使用

    导入后,可以按照DOM4J提供的API进行编程,快速实现XML的读写操作。 总之,DOM4J作为一款强大的XML处理工具,为Java开发者提供了丰富的功能和良好的性能,是处理XML文档的理想选择。无论是小型项目还是大型企业级...

    java中dom4j读写XML

    在提供的压缩包中,可能包含了dom4j的jar文件,解压后将其引入项目,就可以开始使用DOM4J进行XML操作了。 DOM4J不仅提供了基本的XML操作,还支持命名空间、事件处理、DTD和XML Schema验证等功能,是Java开发中处理...

    dom4j_XML.rar_DOM4J_dom4j xml

    在这个"dom4j_XML.rar"压缩包中,我们很可能会找到一个实际的示例,展示如何使用DOM4J来解析XML文件。 首先,让我们理解XML(eXtensible Markup Language)的基本概念。XML是一种标记语言,常用于存储和传输数据,...

    基于UDP和TCP的Socket编程文件传输,DOM4J对于XML读写

    文件的发送方先将文件信息转换为XML格式,通过TCP发送,接收方接收到XML数据后,使用DOM4J解析并执行相应的文件接收操作。 总的来说,这个项目综合运用了TCP和UDP两种不同的网络传输协议,以及DOM4J这一强大的XML...

    dom4j读写xml

    总结,DOM4J作为一款强大的XML处理工具,不仅提供了丰富的API,还支持高效的读写操作和XPath查询,使得开发者能够轻松地进行XML文档的处理和操作。无论是在小型项目还是大型企业级应用中,DOM4J都是处理XML不可或缺...

    利用dom4j读写xml实例xmldemo

    本实例"xmldemo"将向我们展示如何利用DOM4J进行XML的读写操作。 首先,理解DOM4J的核心概念。DOM4J使用了Document对象来表示整个XML文档,Element代表XML的元素节点,Attribute代表属性,Text代表文本内容。通过...

    Dom4j读写XML

    以下是对Dom4j读写XML的详细讲解: 一、Document对象相关 1. **读取XML文件**:通过`SAXReader`实例化并调用`read()`方法,可以将XML文件读取为`Document`对象。例如: ```java SAXReader reader = new ...

    Dom4j下载及使用Dom4j读写XML简介

    Dom4j解析教程。详细讲解如何使用dom4j解析xml,简单易懂。

    dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。下载地址 .txt

    dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的...

    Dom4j结合XPath解析XML文件路径表达式

    Dom4j是一个灵活且高效的处理XML的Java库,它提供了XML的读写、遍历、修改等功能。与DOM(Document Object Model)相比,Dom4j使用起来更高效,内存占用更小,尤其适合处理大型XML文件。 接下来,我们关注XPath的...

Global site tag (gtag.js) - Google Analytics