<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Dom4j全部實例

    Attribute
    Attribute定義了XML的屬性
    Branch
    Branch為能夠包含子節(jié)點的節(jié)點如XML元素(Element)和文檔(Docuemnts)定義了一個公共的行為,
    CDATA
    CDATA 定義了XML CDATA 區(qū)域
    CharacterData是一個標識接口,標識基于字符的節(jié)點。如CDATA,Comment, Text.
    Comment
    Comment 定義了XML注釋的行為
    Document
    定義了XML文檔
    DocumentType
    DocumentType 定義XML DOCTYPE聲明
    Element
    Element定義XML 元素
    ElementHandler
    ElementHandler定義了 Element 對象的處理器
    ElementPath
    被 ElementHandler 使用,用于取得當前正在處理的路徑層次信息
    Entity
    Entity定義 XML entity
    Node
    Node為所有的dom4j中XML節(jié)點定義了多態(tài)行為
    NodeFilter 定義了在dom4j節(jié)點中產(chǎn)生的一個濾鏡或謂詞的行為(predicate)
    ProcessingInstruction
    ProcessingInstruction 定義 XML 處理指令.
    Text
    Text 定義XML 文本節(jié)點.
    Visitor
    Visitor 用于實現(xiàn)Visitor模式.
    XPath
    XPath
    要想弄懂這套接口,關(guān)鍵的是要明白接口的繼承關(guān)系:
    • interface java.lang.Cloneable
      • interface org.dom4j.Node
        • interface org.dom4j.Attribute
        • interface org.dom4j.Branch
          • interface org.dom4j.Document
          • interface org.dom4j.Element
        • interface org.dom4j.CharacterData
          • interface org.dom4j.CDATA
          • interface org.dom4j.Comment
          • interface org.dom4j.Text
        • interface org.dom4j.DocumentType
        • interface org.dom4j.Entity
        • interface org.dom4j.ProcessingInstruction
    1. 讀取并解析XML文檔:
    讀寫XML文檔主要依賴于org.dom4j.io包,其中提供DOMReader和SAXReader兩類不同方式,而調(diào)用方式是一樣的。這就是依靠接口的好處。
     
        // 從文件讀取XML,輸入文件名,返回XML文檔
        public Document read(String fileName) throws MalformedURLException, DocumentException {
           SAXReader reader = new SAXReader();
           Document document = reader.read(new File(fileName));
           return document;
        }
     
        
       
    其中,reader的read方法是重載的,可以從InputStream, File, Url等多種不同的源來讀取。得到的Document對象就帶表了整個XML。根據(jù)本人自己的經(jīng)驗,讀取的字符編碼是按照XML文件頭定義的編碼來轉(zhuǎn)換。如果遇到亂碼問題,注意要把各處的編碼名稱保持一致即可。
    2.    取得Root節(jié)點
    讀取后的第二步,就是得到Root節(jié)點。熟悉XML的人都知道,一切XML分析都是從Root元素開始的。
     
       public Element getRootElement(Document doc){
           return doc.getRootElement();
        }
     
    3.    遍歷XML樹
    DOM4J提供至少3種遍歷節(jié)點的方法:
    1) 枚舉(Iterator)
     
        // 枚舉所有子節(jié)點
        for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
           Element element = (Element) i.next();
           // do something
        }
        // 枚舉名稱為foo的節(jié)點
        for ( Iterator i = root.elementIterator(foo); i.hasNext();) {
           Element foo = (Element) i.next();
           // do something
        }
        // 枚舉屬性
        for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
           Attribute attribute = (Attribute) i.next();
           // do something
        }

    2)遞歸
    遞歸也可以采用Iterator作為枚舉手段,但文檔中提供了另外的做法
     
        public void treeWalk() {
           treeWalk(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....
               }
           }
    }
     

    3) Visitor模式
    最令人興奮的是DOM4J對Visitor的支持,這樣可以大大縮減代碼量,并且清楚易懂。了解設(shè)計模式的人都知道,Visitor是GOF設(shè)計模式之一。其主要原理就是兩種類互相保有對方的引用,并且一種作為Visitor去訪問許多Visitable。我們來看DOM4J中的Visitor模式(快速文檔中沒有提供)
    只需要自定一個類實現(xiàn)Visitor接口即可。
     
            public class MyVisitor extends VisitorSupport {
               public void visit(Element element){
                   System.out.println(element.getName());
               }
               public void visit(Attribute attr){
                   System.out.println(attr.getName());
               }
            }
     
            調(diào)用:  root.accept(new MyVisitor())
        Visitor接口提供多種Visit()的重載,根據(jù)XML不同的對象,將采用不同的方式來訪問。上面是給出的Element和Attribute的簡單實現(xiàn),一般比較常用的就是這兩個。VisitorSupport是DOM4J提供的默認適配器,Visitor接口的Default Adapter模式,這個模式給出了各種visit(*)的空實現(xiàn),以便簡化代碼。
        注意,這個Visitor是自動遍歷所有子節(jié)點的。如果是root.accept(MyVisitor),將遍歷子節(jié)點。我第一次用的時候,認為是需要自己遍歷,便在遞歸中調(diào)用Visitor,結(jié)果可想而知。
    4. XPath支持
        DOM4J對XPath有良好的支持,如訪問一個節(jié)點,可直接用XPath選擇。
     
       public void bar(Document document) {
            List list = document.selectNodes( //foo/bar );
            Node node = document.selectSingleNode(//foo/bar/author);
            String name = node.valueOf( @name );
         }
     
        例如,如果你想查找XHTML文檔中所有的超鏈接,下面的代碼可以實現(xiàn):
     
        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();
            }
         }
     

    5. 字符串與XML的轉(zhuǎn)換
    有時候經(jīng)常要用到字符串轉(zhuǎn)換為XML或反之,
     
        // XML轉(zhuǎn)字符串
      Document document = ...;
        String text = document.asXML();
    // 字符串轉(zhuǎn)XML
        String text = <person> <name>James</name> </person>;
        Document document = DocumentHelper.parseText(text);
     

    6 用XSLT轉(zhuǎn)換XML
     
       public Document styleDocument(
           Document document,
           String stylesheet
        ) throws Exception {
        // load the transformer using JAXP
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer(
           new StreamSource( stylesheet )
        );
        // now lets style the given document
        DocumentSource source = new DocumentSource( document );
        DocumentResult result = new DocumentResult();
        transformer.transform( source, result );
        // return the transformed document
        Document transformedDoc = result.getDocument();
        return transformedDoc;
    }
     

    7. 創(chuàng)建XML
      一般創(chuàng)建XML是寫文件前的工作,這就像StringBuffer一樣容易。
     
        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;
        }
     

    8. 文件輸出
        一個簡單的輸出方法是將一個Document或任何的Node通過write方法輸出
     
        FileWriter out = new FileWriter( foo.xml );
        document.write(out);
     
      如果你想改變輸出的格式,比如美化輸出或縮減格式,可以用XMLWriter類
     
        public void write(Document document) throws IOException {
           // 指定文件
           XMLWriter writer = new XMLWriter(
               new FileWriter( output.xml )
           );
           writer.write( document );
           writer.close();
           // 美化格式
           OutputFormat format = OutputFormat.createPrettyPrint();
           writer = new XMLWriter( System.out, format );
           writer.write( document );
           // 縮減格式
           format = OutputFormat.createCompactFormat();
           writer = new XMLWriter( System.out, format );
           writer.write( document );
        }
     
    5.使用ElementHandler
    XmlHandler.java
    import java.io.File;
     
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.ElementHandler;
    import org.dom4j.ElementPath;
    import org.dom4j.io.SAXReader;
     
    public class XmlHandler {
        public static void main(String[] args) {
           SAXReader saxReader = new SAXReader();
           File file = new File("students.xml");
           try {
               // 添加一個ElementHandler實例。
               saxReader.addHandler("/students/student", new StudentHandler());
               saxReader.read(file);
     
           } catch (DocumentException e) {
               System.out.println(e.getMessage());
           }
        }
     
        /**
         * 定義StudentHandler處理器類,對<student>元素進行處理。
         */
        private static class StudentHandler implements ElementHandler {
           public void .Start(ElementPath path) {
               Element elt = path.getCurrent();
               System.out.println("Found student: " + elt.attribut.ue("sn"));
               // 添加對子元素<name>的處理器。
               path.addHandler("name", new NameHandler());
           }
     
           public void .End(ElementPath path) {
               // 移除對子元素<name>的處理器。
               path.removeHandler("name");
           }
        }
     
        /**
         * 定義NameHandler處理器類,對<student><name>子元素進行處理。
         */
        private static class NameHandler implements ElementHandler {
           public void .Start(ElementPath path) {
               System.out.println("path : " + path.getPath());
           }
     
           public void .End(ElementPath path) {
               Element elt = path.getCurrent();
               // 輸出<name>元素的名字和它的文本內(nèi)容。
               System.out.println(elt.getName() + " : " + elt.getText());
           }
        }
    }

    posted on 2012-06-15 11:14 youngturk 閱讀(645) 評論(0)  編輯  收藏 所屬分類: 幾種文檔解析

    <2012年6月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    1234567

    導航

    統(tǒng)計

    公告

    this year :
    1 jQuery
    2 freemarker
    3 框架結(jié)構(gòu)
    4 口語英語

    常用鏈接

    留言簿(6)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊

    EJB學習

    Flex學習

    learn English

    oracle

    spring MVC web service

    SQL

    Struts

    生活保健

    解析文件

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲AV无码专区在线厂| 亚洲成电影在线观看青青| 亚洲日本成本人观看| 91在线手机精品免费观看| 久久精品亚洲视频| 免费成人在线电影| 情人伊人久久综合亚洲| 另类免费视频一区二区在线观看| 国产亚洲美女精品久久久2020| 视频免费1区二区三区| 亚洲欧洲精品成人久久曰影片 | 亚洲四虎永久在线播放| 人妻无码一区二区三区免费| 日木av无码专区亚洲av毛片| 最好看最新的中文字幕免费 | 日韩精品视频在线观看免费| 亚洲精品99久久久久中文字幕| 一区二区视频免费观看| 国产亚洲精品久久久久秋霞| a级毛片毛片免费观看永久| 久久亚洲精品中文字幕无码| 99久热只有精品视频免费观看17| 亚洲视频一区在线播放| 国产一卡2卡3卡4卡2021免费观看| 亚洲狠狠成人综合网| 日本午夜免费福利视频| 美女被艹免费视频| 国产成人A亚洲精V品无码 | 亚洲精品免费视频| 0588影视手机免费看片| 亚洲一区AV无码少妇电影| 免费jjzz在线播放国产| 成人A毛片免费观看网站| 亚洲精品线在线观看| 香蕉97超级碰碰碰免费公| 亚洲精品永久在线观看| 亚洲欧洲中文日韩久久AV乱码| a级毛片黄免费a级毛片| 亚洲国产精品综合久久久| 日韩一品在线播放视频一品免费| 一道本不卡免费视频|