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

利用dom4j操作.xml文件

阅读更多
由于工作需要,前些天学习了一下dom4j,当然在网上也查了很多资料,有一篇文章给了我很大帮助,算是启蒙吧,本想把它的地址贴出来的,却找不到了,不过还是很感谢。

import org.dom4j.Document;
import java.util.List;
import java.util.Iterator;
import org.dom4j.Element;
import org.dom4j.Attribute;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.io.IOException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.FileOutputStream;

public class XmlFile {

    /**
     * 载入一个文件
     * 不只限于.xml,也可是.txt等
     * */
    public static Document loadFile(String filename) {
        Document document = null;
        try {
            SAXReader saxReader = new SAXReader();
            document = saxReader.read(new File(filename));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return document;
    }

    /**
     * 添加节点
     * <database>
     *   <station>
     *     <datasource name="" laststarttime="" lastendtime=""/>
     *     <datasource name="" laststarttime="" lastendtime=""/>
     *   </station>
     *</database>
     * 添加一个新的结点,(一行<datasource name="" laststarttime="" lastendtime=""/>)
     * fileName:文件名,node[]:节点(以上面的文件为例,添加一个新的 datasource ,node[]={"station","datasource"}),attribute[]:Attribute列表(以上面的文件为例,attribute[]={"name","laststarttime","lastendtime"})
     * */
    public static void xmlAddNode(String fileName, String[] node,
                                  String[] attribute, String[] value) {
        Document doc = loadFile(fileName);
        Element element = doc.getRootElement();
        for (int i = 0; i < node.length - 1; i++) {
            element = element.element(node[i]);
        }
        element = element.addElement(node[node.length - 1]);
        for (int i = 0; i < attribute.length; i++) {
            element.addAttribute(attribute[i], value[i]);
        }
        try {
            saveDoc(doc, fileName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     *输出文件中所有具体节点的数据
     * 例如文件格式如下
     * SelectFromXML.xml
     *   <?xml version="1.0" encoding="GBK"?>
     *   <SelectDefineByXML>
     *     <select name="dbsource">
     *       <item option="jdbc/3309"/>
     *       <item option="jdbc/3307"/>
     *     </select>
     *   </SelectDefineByXML>
     * 读取/SelectDefineByXML/select/item里option的值
     * fileName文件名,rootnode根节点,attributename要读取的Attribute
     * 调用方式:xmlRead("/SelectFromXML.xml","/SelectDefineByXML/select/item","option");
     * 同parserXML(String fileName)功能一样,只是parserXML有返回值
     * */
    public static void xmlRead(String fileName, String rootnode,
                               String attributename) {
        Document doc = loadFile(fileName);
        List list = doc.selectNodes(rootnode);
        Iterator it = list.iterator();
        while (it.hasNext()) {
            Element element = (Element) it.next();
            Attribute intem = element.attribute(attributename);
            System.out.println(attributename + ":" + intem.getValue());
        }
    }


    /**
     *根据某一特定数据读取/修改文件中某一具体节点的数据
     * 例如文件格式如下
     *   <?xml version="1.0" encoding="GBK"?>
     *   <database>
     *     <station>
     *       <datasource name="jdbc/3307" laststarttime="2007-10-29 17:11:19" lastendtime="2007-10-29 16:40:20"/>
     *       <datasource name="jdbc/3308" laststarttime="2007-10-29 16:46:28" lastendtime="2007-10-29 16:40:30"/>
     *     </station>
     *   </database>
     * 根据name的值读取/修改lastendtime的值
     * fileName文件名,rootnode根节点(如:/database/station/datasource)
     * attributename要读取的Attribute名(如:lastendtime)
     * referenceattribute参考Attribute名(如:name)
     * referencevalue参考Attribute的值
     * attributevalue修改时attributename要改为的值
     * mod:true 修改,false:读取
     * 调用方式:lastendtime = xmlfile.xmlReadOrMod("/databaselog.xml","/database/station/datasource","lastendtime","name","jdbc/3007","2007-11-1 10:18:57", true);
     * */
    public static String xmlReadOrMod(String fileName, String rootnode,
                                      String attributename,
                                      String referenceattribute,
                                      String referencevalue,
                                      String attributevalue, boolean mod) {
        String result = "";
        Document doc = loadFile(fileName);
        List list = doc.selectNodes(rootnode);
        Iterator it = list.iterator();
        while (it.hasNext()) {
            Element element = (Element) it.next();
            Attribute endnode_ = element.attribute(attributename);
            Attribute reference_ = element.attribute(referenceattribute);
            if (reference_.getValue().equals(referencevalue)) {
                result = endnode_.getValue();
                if (mod) {
                    try {
                        endnode_.setValue(attributevalue);
                        saveDoc(doc, fileName);
                        break;
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                break;
            }
        }
        return result;
    }

    /**
     *读取文件中所有具体节点的数据
     * 例如文件格式如下
     *   <?xml version="1.0" encoding="GBK"?>
     *   <SelectDefineByXML>
     *     <select name="dbsource">
     *       <item option="jdbc/3309"/>
     *       <item option="jdbc/3307"/>
     *     </select>
     *   </SelectDefineByXML>
     * 读取rootnode(select)/node(item)里attribute(option)的值
     * 同xmlRead(String fileName)功能一样,只是xmlRead没有返回值
     * 如果要得到option的值,方法调用的时候:parserXML("文件名","select","item", "option");
     * */
    public List parserXML(String fileName, String rootnode, String node,
                          String attribute) {
        ArrayList list = new ArrayList();
        try {
            Document doc = loadFile(fileName);
            Element root = doc.getRootElement();
            // 解析rootnode集合
            for (Iterator i = root.elementIterator(rootnode); i.hasNext(); ) {
                Element select = (Element) i.next();
                Iterator k = select.elementIterator(node);
                while (k.hasNext()) {
                    Element item = (Element) k.next();
                    Attribute aOption = item.attribute(attribute);
                    list.add(aOption.getValue());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

    /**
     * 同parserXML(String fileName, String rootnode, String node,String attribute)作用一样
     * 同parserXML的区别,parserXmlRead从类路径读取文件
     */
    public List parserXmlRead(String fileName, String rootnode, String node,
                              String attribute) {
        ArrayList list = new ArrayList();
        try {
            // 从类路径读取配置文件。
            InputStream stream = getClass().getResourceAsStream(
                    fileName);
            SAXReader reader = new SAXReader();
            Document doc = reader.read(stream);
            Element root = doc.getRootElement();
            // 解析rootnode集合
            for (Iterator i = root.elementIterator(rootnode); i.hasNext(); ) {
                Element select = (Element) i.next();
                Iterator k = select.elementIterator(node);
                while (k.hasNext()) {
                    Element item = (Element) k.next();
                    Attribute aOption = item.attribute(attribute);
                    System.out.println(aOption.getValue());
                    list.add(aOption.getValue());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }


    /**
     *读取/修改某个节点的数据
     * 文件格式如下:
     *   <?xml version="1.0" encoding="GBK"?>
     *   <database>
     *     <center>
     *       <datasource>
     *         <name>db0000</name>
     *       </datasource>
     *     </center>
     *   </database>
     * 读取/修改name的值(database/center/datasource的name值),filename文件名,rootnode根节点
     * 当mod=true时修改
     * 适用于取得单个值
     * */
    public static String xmlReadOrMod(String filename, String node, boolean mod,
                                      String modvalue) {
        Document doc = loadFile(filename);
        /** 直接取得 node 的值 */
        List list = doc.selectNodes(node);
        Iterator it = list.iterator();
        String result = "";
        Element hostElement = (Element) it.next();
        result = hostElement.getText();
        //如果mod=true那么修改并保存
        if (mod) {
            System.out.println(mod);
            hostElement.setText(modvalue);
            try {
                saveDoc(doc, filename);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        System.out.println(hostElement.getText());
        return result;
    }


    /**
     *修改某个节点的数据
     * 文件格式如下:
     *   <?xml version="1.0" encoding="GBK"?>
     *   <database>
     *      <station>
     *        <datasource>
     *          <name>888</name>
     *          <name>111</name>
     *          <name>222</name>
     *          <name>333</name>
     *        </datasource>
     *      </station>
     *   </database>
     * 读取name的值(database/station/datasource/name值),如果某一个值==recvalue,则修改为value
     * filename文件名,node节点,返回String
     * */
    public static void xmlMod(String filename, String node, String recvalue,
                              String value) {
        Document doc = loadFile(filename);
        /** 直接取得 node 的值 */
        List list = doc.selectNodes(node);
        Iterator it = list.iterator();
        while (it.hasNext()) {
            Element hostElement = (Element) it.next();
            System.out.println("hostElement=" +
                               hostElement.getText());
            //修改node的值
            if (hostElement.getText().equals(recvalue)) {
                hostElement.setText(value);
                try {
                    saveDoc(doc, filename);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     *读取/修改某个节点的数据
     * 文件格式如下:
     *   <?xml version="1.0" encoding="GBK"?>
     *   <database>
     *     <center>
     *       <datasource name="db0000"/>
     *     </center>
     *   </database>
     * 读取/修改name的值(database/center/datasource/@name值)
     * filename文件名,node节点,返回String
     * mod:true 修改,false 读取
     * modvalue修改值
     * */
    public static String xmlMod(String filename, String node, boolean mod,
                                String modvalue) {
        Document doc = loadFile(filename);
        /** 直接取得 node 的值 */
        List list = doc.selectNodes(node);
        Iterator it = list.iterator();
        String result = "";
        if (it.hasNext()) {
            Attribute attribute = (Attribute) it.next();
            result = attribute.getValue();
            //修改node的值
            if (mod) {
                try {
                    attribute.setValue(modvalue);
                    saveDoc(doc, filename);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }


    /**
     *读取文件中所有具体节点的数据
     * 例如文件格式如下
     *   <?xml version="1.0" encoding="GBK"?>
     *   <SelectDefineByXML>
     *     <select name="dbsource">
     *       <item option="jdbc/3309"/>
     *       <item option="jdbc/3307"/>
     *     </select>
     *   </SelectDefineByXML>
     * 读取/SelectDefineByXML/select/item里option的值
     * 同 xmlRead(String fileName),parserXML(String fileName) 功能一样
     * */
    public static void xmlReadNode(String filename, String rootnode,
                                   String node) {
        Document doc = loadFile(filename);
        List list = doc.selectNodes(rootnode);
        Iterator it = list.iterator();
        /** 直接用属性path取得name值 */
        list = doc.selectNodes(rootnode + "/@" + node);
        it = list.iterator();
        while (it.hasNext()) {
            Attribute attribute = (Attribute) it.next();
            System.out.println("@node=" + attribute.getValue());
        }

    }

    /**
     * 保存XML文档
     * @param doc
     * @throws IOException
     */
    public static void saveDoc(Document doc, String savefilename) throws
            IOException {
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter writer = new XMLWriter(new FileOutputStream(savefilename),
                                         format);
        writer.write(doc);
        writer.close();
    }

}
分享到:
评论
1 楼 feiniao04 2009-09-19  
想请教一下,假如根节点下面的一级子节点中有很多属性,每个我都需要,具体改如何解析呢。
比方说我有这样一个文件,名称是:gpd.xml

内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<root-container name="purchase" width="1051" height="615">
  <node name="开始填写采购申请" x="300" y="24" width="132" height="36">
    <edge>
      <label x="5" y="-10"/>
    </edge>
  </node>
  <node name="修改采购申请" x="576" y="72" width="132" height="36">
    <edge>
      <label x="5" y="-10"/>
      <bendpoint w1="-157" h1="-2" w2="118" h2="-56"/>
    </edge>
  </node>
  <node name="join1" x="276" y="360" width="177" height="24">
    <edge>
      <label x="5" y="-10"/>
    </edge>
  </node>
  <node name="主管审批" x="432" y="252" width="132" height="36">
    <edge>
      <label x="5" y="-10"/>
    </edge>
  </node>
  <node name="申请人取消申请" x="180" y="252" width="132" height="36">
    <edge>
      <label x="5" y="-10"/>
    </edge>
  </node>
  <node name="fork1" x="288" y="132" width="158" height="24">
    <edge>
      <label x="5" y="34"/>
      <bendpoint w1="128" h1="2" w2="-3" h2="-124"/>
    </edge>
    <edge>
      <label x="-77" y="29"/>
      <bendpoint w1="-124" h1="2" w2="-3" h2="-124"/>
    </edge>
  </node>
  <node name="判断流程流转走向" x="300" y="420" width="132" height="36">
    <edge>
      <label x="5" y="-10"/>
    </edge>
    <edge>
      <label x="5" y="-10"/>
      <bendpoint w1="284" h1="0" w2="8" h2="348"/>
    </edge>
  </node>
  <node name="结束" x="300" y="492" width="132" height="36"/>
</root-container>

我现在想获得所有节点名称为“node”中的 x,y,width还有height的值。
你的方法写的挺好,但是我初次研究解析xml文件的方法,不知如何变通。急盼解答。

相关推荐

    使用Maven管理项目,实现DOM4j操作XML文件

    在这个示例中,我们将深入探讨如何利用Maven管理和DOM4j来操作XML文件。 首先,让我们了解一下Maven。Maven是Apache软件基金会的一个项目,它通过定义项目对象模型(Project Object Model,POM)来管理项目的构建、...

    详细介绍使用Dom4j读取xml文件的方法

    ### 使用Dom4j读取XML文件的方法详解 #### 一、引言 在Java开发过程中,经常需要处理各种格式的数据文件,其中XML(可扩展标记语言)作为一种标准的数据交换格式被广泛使用。为了高效地解析和操作XML文档,开发者...

    dom4j.jar 下载

    这个JAR文件包含了DOM4J的所有类和资源,使得开发者能够将其引入到自己的Java项目中,以便利用DOM4J的功能。 描述中提到"dom4j.jar包用于解析xml文档使用,已经验证,解压引入工程即可使用",这说明DOM4J的主要用途...

    dom4j-2.1.3.zip

    《深入解析DOM4J 2.1.3》 DOM4J是一个强大的Java XML API,它提供了丰富的XML处理功能,包括文档对象模型(DOM)、简单API(SAX)以及...通过深入学习和实践,你可以充分利用DOM4J的强大功能,提升你的XML处理能力。

    Dom4j-XML.rar_dom4j xml

    本示例将详细介绍如何利用DOM4J进行XML文件的操作,包括创建XML文档、解析XML内容以及对XML元素的增删改查。 首先,我们需要理解XML(Extensible Markup Language)的基本概念。XML是一种自描述性的标记语言,常...

    dom4j解析struts.xml需要的包装类

    总结起来,`dom4j`是解析XML文件的强大工具,而`ActionWrapper`、`PackageWrapper`和`ResultWrapper`则是对`struts.xml`配置信息的抽象,它们有助于简化和优化Struts2应用的配置管理。通过使用这些包装类,我们可以...

    dom4j解析xml文件代码示例

    在本示例中,我们将深入探讨如何使用DOM4J解析XML文件,以`CacheInit.java`作为我们的核心代码示例,并参考`emailTemplateConfig.xml`作为实际操作的对象。 首先,让我们了解XML(eXtensible Markup Language)。...

    Dom4j解析struts2框架的struts.xml

    下面我们将详细介绍如何利用Dom4j解析`struts.xml`文件中的关键元素。 首先,导入必要的库,包括Dom4j库和其他Struts2依赖。在你的项目中,确保添加了以下Maven依赖: ```xml &lt;groupId&gt;dom4j &lt;artifactId&gt;dom4j...

    dom4j-2.0.3.zip

    在实际开发中,DOM4J常用于XML配置文件的读写,如Spring框架的配置文件处理。此外,它还广泛应用于数据交换、XML数据的序列化与反序列化,以及XML文档的转换等场景。 五、API使用示例 以下是一个简单的示例,展示...

    利用dom4j--读取xml文件

    在本文中,我们将详细探讨如何利用DOM4J库来读取XML文件。 1. **安装DOM4J** 要使用DOM4J,首先需要将其添加到你的项目依赖中。如果你使用的是Maven,可以在`pom.xml`文件中添加以下依赖: ```xml &lt;groupId&gt;...

    dom4j解析xml文件(增删改查)

    在“dom4j解析xml文件(增删改查)”这个主题中,我们将深入探讨如何使用DOM4J来实现XML文档的四种基本操作:增加元素、删除元素、更新元素内容以及查询元素。 首先,让我们了解DOM4J的基本用法。在解析XML文件时,...

    dom4j解析xml,利用反射机制

    在这个项目中,我们利用DOM4J来解析XML文件,并通过Java的反射机制将解析出的信息存储到特定的类中。 首先,我们需要了解XML的基本概念。XML(Extensible Markup Language)是一种标记语言,常用于数据交换和结构化...

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

    1. **解析XML**:DOM4J可以读取XML文件,将其转换为一个树形结构,即Document对象。解析器有SAX和DOM两种模式,SAX是事件驱动的,适用于大文件,而DOM则将整个文档加载到内存中,适合小文件。 2. **创建XML**:DOM4...

    dom4j-1.6.1.jar

    DOM4J是一个强大的Java库,专门用于处理XML文档。它是一个灵活且高性能的XML解析器,提供了丰富的API来创建、修改和...通过解压并将其添加到项目中,开发者可以利用DOM4J提供的丰富功能,提高XML处理的效率和便利性。

    Dom4J生成XML的完整方法希望大家能用到

    Dom4J作为一款优秀的Java XML API,以其简洁、高效的特点,在生成、解析和操作XML文档方面表现突出。本文将深入探讨如何使用Dom4J库来创建XML文档,包括初始化文档、添加元素、设置属性、插入文本以及最终保存文档至...

    通过Dom4j创建和读取xml文件下载

    本教程将详细讲解如何利用DOM4J进行XML文件的创建和读取。首先,我们需要了解DOM4J的核心概念,如Element、Attribute、Document等。 1. **DOM4J基本概念**: - **Document**: XML文档的根节点,代表整个XML文件。 ...

    dom4j-1.6.1.jar和xmlbeans-2.6.0.jar

    2. **SAX和DOM**: 除了DOM,DOM4J还支持SAX解析器,允许在内存有限的情况下处理大型XML文件。 3. **XPath**: 支持XPath表达式,使得可以方便地定位和提取XML文档中的特定节点。 4. **事件模型**: 提供了基于事件的...

    解析XML所需的jar dom4j.jar 多个版本

    与DOM(Document Object Model)相比,dom4j通常被认为更轻量级,内存占用更少,因此在处理大型XML文件时更有优势。此外,dom4j的API设计更加面向对象,使得代码更易读写和维护。 总结来说,dom4j是一个强大的XML...

    dom4j操作xml文件

    在本文中,我们将深入探讨如何利用DOM4J进行XML文件的读取、写入和修改操作。 一、XML基础 XML(Extensible Markup Language)是一种标记语言,用于存储和传输结构化数据。它具有自解释性,使得数据在不同的系统间...

    dom4j操作XMl例子

    在本示例中,"dom4jExample.java"是一个Java程序,它展示了如何利用DOM4J库来操作XML文件。 首先,我们需要了解DOM4J的基本概念。DOM4J采用Document Object Model (DOM)接口,但它的实现比标准DOM更快,占用内存更...

Global site tag (gtag.js) - Google Analytics