zoukankan      html  css  js  c++  java
  • Java操作XML文件 dom4j 篇

    在项目中,我们很多都用到了xml文件,无论是参数配置还是与其它系统的数据交互。
    今天就来讲一下Java 中使用dom4j来操作XML文件。

    我们需要引入的包:

    //文件包 
    import java.io.ByteArrayOutputStream; 
    import java.io.File; 
    import java.io.FileWriter; 
    //工具包 
    import java.util.Iterator; 
    import java.util.List; 
    //dom4j包 
    import org.dom4j.Attribute; 
    import org.dom4j.Document; 
    import org.dom4j.DocumentHelper; 
    import org.dom4j.Element; 
    import org.dom4j.io.OutputFormat; 
    import org.dom4j.io.SAXReader; 
    import org.dom4j.io.XMLWriter;

    1、将XML文件的内容转化为String

       /** 
        * doc2String 
        * 将xml文档内容转为String 
        * @return 字符串 
        * @param document 
        */ 
       public static String doc2String(Document document) 
       { 
          String s = ""; 
          try 
          { 
               //使用输出流来进行转化 
               ByteArrayOutputStream out = new ByteArrayOutputStream(); 
               //使用GB2312编码 
               OutputFormat format = new OutputFormat("  ", true, "GB2312"); 
               XMLWriter writer = new XMLWriter(out, format); 
               writer.write(document); 
               s = out.toString("GB2312"); 
          }catch(Exception ex) 
          {             
               ex.printStackTrace(); 
          }       
          return s; 
       }

    2、将符合XML格式的String 转化为XML Document

       /** 
        * string2Document 
        * 将字符串转为Document 
        * @return  
        * @param s xml格式的字符串 
        */ 
       public static Document string2Document(String s) 
       { 
          Document doc = null; 
          try 
          { 
               doc = DocumentHelper.parseText(s); 
          }catch(Exception ex) 
          {             
               ex.printStackTrace(); 
          } 
          return doc; 
       }

    3、将Document对象保存为一个xml文件到本地

       /** 
        * doc2XmlFile 
        * 将Document对象保存为一个xml文件到本地 
        * @return true:保存成功  flase:失败 
        * @param filename 保存的文件名 
        * @param document 需要保存的document对象 
        */ 
       public static boolean doc2XmlFile(Document document,String filename) 
       { 
          boolean flag = true; 
          try 
          { 
                /* 将document中的内容写入文件中 */ 
                //默认为UTF-8格式,指定为"GB2312" 
                OutputFormat format = OutputFormat.createPrettyPrint(); 
                format.setEncoding("GB2312"); 
                XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)),format); 
                writer.write(document); 
                writer.close();             
            }catch(Exception ex) 
            { 
                flag = false; 
                ex.printStackTrace(); 
            } 
            return flag;       
       }

    4、将xml格式的字符串保存为本地文件,如果字符串格式不符合xml规则,则返回失败

       /** 
        * string2XmlFile 
        * 将xml格式的字符串保存为本地文件,如果字符串格式不符合xml规则,则返回失败 
        * @return true:保存成功  flase:失败 
        * @param filename 保存的文件名 
        * @param str 需要保存的字符串 
        */ 
       public static boolean string2XmlFile(String str,String filename) 
       { 
          boolean flag = true; 
          try 
          { 
             Document doc =  DocumentHelper.parseText(str);        
             flag = doc2XmlFile(doc,filename); 
          }catch (Exception ex) 
          { 
             flag = false; 
             ex.printStackTrace(); 
          } 
          return flag; 
       }

    5、载入一个xml文档

       /** 
        * load 
        * 载入一个xml文档 
        * @return 成功返回Document对象,失败返回null 
        * @param uri 文件路径 
        */ 
       public static Document load(String filename) 
       { 
          Document document = null; 
          try  
          {  
              SAXReader saxReader = new SAXReader(); 
              document = saxReader.read(new File(filename));            filename = "E://11.txt"
          } 
          catch (Exception ex){ 
              ex.printStackTrace(); 
          }   
          return document; 
       }

     6、演示String保存为xml文件

       /** 
        * xmlWriteDemoByString 
        * 演示String保存为xml文件 
        */ 
       public void xmlWriteDemoByString() 
       { 
          String s = ""; 
          /** xml格式标题 "<?xml version='1.0' encoding='GB2312'?>" 可以不用写*/ 
          s = "<config> " 
             +"   <ftp name='DongDian'> " 
             +"     <ftp-host>127.0.0.1</ftp-host> " 
             +"     <ftp-port>21</ftp-port> " 
             +"     <ftp-user>cxl</ftp-user> " 
             +"     <ftp-pwd>longshine</ftp-pwd> " 
             +"     <!-- ftp最多尝试连接次数 --> " 
             +"     <ftp-try>50</ftp-try> " 
             +"     <!-- ftp尝试连接延迟时间 --> " 
             +"     <ftp-delay>10</ftp-delay> " 
             +"  </ftp> " 
             +"</config> "; 
          //将文件生成到classes文件夹所在的目录里    
          string2XmlFile(s,"xmlWriteDemoByString.xml");    
          //将文件生成到classes文件夹里    
          string2XmlFile(s,"classes/xmlWriteDemoByString.xml");   
       }

    7、演示手动创建一个Document,并保存为XML文件

       /** 
        * 演示手动创建一个Document,并保存为XML文件 
        */ 
       public void xmlWriteDemoByDocument() 
       { 
            /** 建立document对象 */ 
            Document document = DocumentHelper.createDocument(); 
            /** 建立config根节点 */ 
            Element configElement = document.addElement("config"); 
            /** 建立ftp节点 */ 
            configElement.addComment("东电ftp配置"); 
            Element ftpElement = configElement.addElement("ftp"); 
            ftpElement.addAttribute("name","DongDian"); 
            /** ftp 属性配置 */ 
            Element hostElement = ftpElement.addElement("ftp-host"); 
            hostElement.setText("127.0.0.1"); 
            (ftpElement.addElement("ftp-port")).setText("21"); 
            (ftpElement.addElement("ftp-user")).setText("cxl"); 
            (ftpElement.addElement("ftp-pwd")).setText("longshine"); 
            ftpElement.addComment("ftp最多尝试连接次数"); 
            (ftpElement.addElement("ftp-try")).setText("50"); 
            ftpElement.addComment("ftp尝试连接延迟时间"); 
            (ftpElement.addElement("ftp-delay")).setText("10");     
            /** 保存Document */ 
            doc2XmlFile(document,"classes/xmlWriteDemoByDocument.xml"); 
       }

    8、演示读取文件的具体某个节点的值

       /** 
        *  演示读取文件的具体某个节点的值  
        */ 
       public static void xmlReadDemo() 
       { 
          Document doc = load("classes/xmlWriteDemoByDocument.xml"); 
          //Element root = doc.getRootElement(); 
          /** 先用xpath查找所有ftp节点 并输出它的name属性值*/ 
          List list = doc.selectNodes("/config/ftp" ); 
          Iterator it = list.iterator(); 
          while(it.hasNext()) 
          {    
              Element ftpElement = (Element)it.next(); 
              System.out.println("ftp_name="+ftpElement.attribute("name").getValue()); 
          } 
          /** 直接用属性path取得name值 */ 
          list = doc.selectNodes("/config/ftp/@name" ); 
          it = list.iterator(); 
          while(it.hasNext()) 
          {    
              Attribute attribute = (Attribute)it.next(); 
              System.out.println("@name="+attribute.getValue()); 
          } 
          /** 直接取得DongDian ftp的 ftp-host 的值 */ 
          list = doc.selectNodes("/config/ftp/ftp-host" ); 
          it = list.iterator(); 
          Element hostElement=(Element)it.next(); 
          System.out.println("DongDian's ftp_host="+hostElement.getText()); 
       }

    9、修改或删除某个值或属性

    /** ftp节点删除ftp-host节点 */ 
    ftpElement.remove(hostElement);  
    /** ftp节点删除name属性 */ 
    ftpElement.remove(nameAttribute); 
    /** 修改ftp-host的值 */ 
    hostElement.setText("192.168.0.1");  
    /** 修改ftp节点name属性的值 */ 
    nameAttribute.setValue("ChiFeng");
    dom4j(Version 1.6.1)快速入门

    Parsing XML


        或许你想要做的第一件事情就是解析一个某种类型的XML文档,用dom4j很容易做到。请看下面的示范代码:

    import java.net.URL;

    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.io.SAXReader;

    public class Foo {

        public Document parse(URL url) throws DocumentException {
            SAXReader reader = new SAXReader();
            Document document = reader.read(url);
            return document;
        }
    }

    使用迭代器(Iterators)


        我们可以通过多种方法来操作XML文档,这些方法返回java里标准的迭代器(Iterators)。例如:

    public void bar(Document document) throws DocumentException {
            Element root = document.getRootElement();
            //迭代根元素下面的所有子元素
            for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
                Element element = (Element) i.next();
                //处理代码
            }

            //迭代根元素下面名称为"foo"的子元素
            for ( Iterator i = root.elementIterator( "foo" ); i.hasNext(); ) {
                Element foo = (Element) i.next();
                //处理代码
            }

            // 迭代根元素的属性attributes)元素
            for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
                Attribute attribute = (Attribute) i.next();
                // do something
            }
         }

    强大的XPath导航


        在dom4j中XPath可以表示出在XML树状结构中的Document或者任意的节点(Node)(例如:Attribute,Element 或者ProcessingInstruction等)。它可以使在文档中复杂的操作仅通过一行代码就可以完成。例如:

    public void bar(Document document) {
            List list = document.selectNodes( "//foo/bar" );

            Node node = document.selectSingleNode( "//foo/bar/author" );

            String name = node.valueOf( "@name" );
        }

        如果你想得到一个XHTML文档中的所有超文本链接(hypertext links)你可以使用下面的代码:

        public void findLinks(Document document) throws DocumentException {

            List list = document.selectNodes( "//a/@href" );

            for (Iterator iter = list.iterator(); iter.hasNext(); ) {
                Attribute attribute = (Attribute) iter.next();
                String url = attribute.getValue();
            }
        }

        如果你需要关于XPath语言的任何帮助,我们强烈推荐这个站点Zvon tutorial他会通过一个一个的例子引导你学习。

    快速遍历(Fast Looping)



    如果你不得不遍历一个非常大的XML文档,然后才去执行,我们建议你使用快速遍历方法(fast looping method),它可以避免为每一个循环的节点创建一个迭代器对象,如下所示:

    public void treeWalk(Document document) {
            treeWalk( document.getRootElement() );
        }

        public void treeWalk(Element element) {
            for ( int i = 0, size = element.nodeCount(); i < size; i++ ) {
                Node node = element.node(i);
                if ( node instanceof Element ) {
                    treeWalk( (Element) node );
                }
                else {
                    // do something....
                }
            }
        }

    生成一个新的XML文档对象


        在dom4j中你可能常常希望用程序生成一个XML文档对象,下面的程序为你进行了示范:

    import org.dom4j.Document;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;

    public class Foo {

        public Document createDocument() {
            Document document = DocumentHelper.createDocument();
            Element root = document.addElement( "root" );

            Element author1 = root.addElement( "author" )
                .addAttribute( "name", "James" )
                .addAttribute( "location", "UK" )
                .addText( "James Strachan" );
            
            Element author2 = root.addElement( "author" )
                .addAttribute( "name", "Bob" )
                .addAttribute( "location", "US" )
                .addText( "Bob McWhirter" );

            return document;
        }
    }

    将一个文档对象写入文件中


        将一个文档对象写入Writer对象的一个简单快速的途径是通过write()方法。

            FileWriter out = new FileWriter( "foo.xml" );
            document.write( out );

    如果你想改变输出文件的排版格式,比如你想要一个漂亮的格式或者是一个紧凑的格式,或者你想用Writer 对象或者OutputStream 对象来操作,那么你可以使用XMLWriter 类。

    import org.dom4j.Document;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.XMLWriter;

    public class Foo {

        public void write(Document document) throws IOException {

            // 写入文件
            XMLWriter writer = new XMLWriter(
                new FileWriter( "output.xml" )
            );
            writer.write( document );
            writer.close();


            // 以一种优雅的格式写入System.out对象
            OutputFormat format = OutputFormat.createPrettyPrint();
            writer = new XMLWriter( System.out, format );
            writer.write( document );

            // 以一种紧凑的格式写入System.out对象
            format = OutputFormat.createCompactFormat();
            writer = new XMLWriter( System.out, format );
            writer.write( document );
        }
    }

    转化为字符串,或者从字符串转化


        如果你有一个文档(Document)对象或者任何一个节点(Node)对象的引用(reference),象属性(Attribute)或者元素(Element),你可以通过asXML()方法把它转化为一个默认的XML字符串:

            Document document = ...;
            String text = document.asXML();

    如果你有一些XML内容的字符串表示,你可以通过DocumentHelper.parseText()方法将它重新转化为文档(Document)对象:

            String text = "<person> <name>James</name> </person>";
            Document document = DocumentHelper.parseText(text);

    通过XSLT样式化文档(Document)



        使用Sun公司提供的JAXP API将XSLT 应用到文档(Document)上是很简单的。它允许你使用任何的XSLT引擎(例如:Xalan或SAXON等)来开发。下面是一个使用JAXP创建一个转化器(transformer),然后将它应用到文档(Document)上的例子:

    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;

    import org.dom4j.Document;
    import org.dom4j.io.DocumentResult;
    import org.dom4j.io.DocumentSource;

    public class Foo {

        public Document styleDocument(
            Document document, 
            String stylesheet
        ) throws Exception {

            // 使用 JAXP 加载转化器
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory.newTransformer( 
                new StreamSource( stylesheet ) 
            );

            // 现在来样式化一个文档(Document)
            DocumentSource source = new DocumentSource( document );
            DocumentResult result = new DocumentResult();
            transformer.transform( source, result );

            // 返回经过样式化的文档(Document)
            Document transformedDoc = result.getDocument();
            return transformedDoc;
        }
    }
     
     
     
     
    阅读(965
  • 相关阅读:
    阅读ARm芯片手册 阅读方法
    Linux驱动mmap内存映射
    Linux下inotify的基本使用及注意事项
    网络视频监控与人脸识别
    Linux pci驱动源码
    Verilog语法
    跟着我从零开始入门FPGA(一周入门XXOO系列)-1、Verilog语法
    周立功-我的25年嵌入式生涯
    Linux 进程学习
    [转]MFC下关于“建立空文档失败”问题的分析
  • 原文地址:https://www.cnblogs.com/u0mo5/p/4100930.html
Copyright © 2011-2022 走看看