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
  • 相关阅读:
    android数据恢复
    UVA 690 Pipeline Scheduling
    2017 国庆湖南 Day4
    2017 国庆湖南 Day5
    2017 国庆湖南 Day6
    2017国庆 清北学堂 北京综合强化班 Day1
    2017 国庆湖南Day2
    bzoj 2962 序列操作
    UVA 818 Cutting Chains
    UVA 211 The Domino Effect
  • 原文地址:https://www.cnblogs.com/u0mo5/p/4100930.html
Copyright © 2011-2022 走看看