java-tju

          BlogJava 聯(lián)系 聚合 管理
            1 Posts :: 2 Stories :: 1 Comments :: 0 Trackbacks

          2007年6月5日 #


          二、JDOM 包概覽
          JDOM是由以下幾個包組成的
          org.JDOM
          org.JDOM.input
          org.JDOM.output
          org.JDOM.adapters
          org.JDOM.transform

          三、JDOM 類說明

          org.JDOM
          這個包里的類是你解析xml文件后所要用到的所有數(shù)據(jù)類型。
          Attribute
          CDATA
          Coment
          DocType
          Document
          Element
          EntityRef
          Namespace
          ProscessingInstruction
          Text

          org.JDOM.transform
          在涉及xslt格式轉(zhuǎn)換時應(yīng)使用下面的2個類
          JDOMSource
          JDOMResult

          org.JDOM.input
          輸入類,一般用于文檔的創(chuàng)建工作
          SAXBuilder
          DOMBuilder
          ResultSetBuilder

          org.JDOM.output
          輸出類,用于文檔轉(zhuǎn)換輸出
          XMLOutputter
          SAXOutputter
          DomOutputter
          JTreeOutputter

          使用前注意事項:
          1.JDOM對于JAXP 以及 TRax 的支持
          JDOM 支持JAXP1.1:你可以在程序中使用任何的parser工具類,默認(rèn)情況下是JAXP的parser。
          制定特別的parser可用如下形式
          SAXBuilder parser
            = new SAXBuilder("org.apache.crimson.parser.XMLReaderImpl");
           Document doc = parser.build(" // work with the document...
          JDOM也支持TRaX:XSLT可通過JDOMSource以及JDOMResult類來轉(zhuǎn)換(參見以后章節(jié))
          2.注意在JDOM里文檔(Document)類由org.JDOM.Document 來表示。這要與org.w3c.dom中的Document區(qū)別開,這2種格式如何轉(zhuǎn)換在后面會說明。
          以下如無特指均指JDOM里的Document。


          四、JDOM主要使用方法
          1.Ducument類
          (1)Document的操作方法:
          Element root = new Element("GREETING");
          Document doc = new Document(root);
          root.setText("Hello JDOM!");
          或者簡單的使用Document doc = new Document(new Element("GREETING").setText("Hello JDOM!t"));

          這點(diǎn)和DOM不同。Dom則需要更為復(fù)雜的代碼,如下:
          DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
          DocumentBuilder builder =factory.newDocumentBuilder();
          Document doc = builder.newDocument();
          Element root =doc.createElement("root");
          Text text = doc.createText("This is the root");
          root.appendChild(text);
          doc.appendChild(root);


          注意事項:JDOM不允許同一個節(jié)點(diǎn)同時被2個或多個文檔相關(guān)聯(lián),要在第2個文檔中使用原來老文檔中的節(jié)點(diǎn)的話。首先需要使用detach()把這個節(jié)點(diǎn)分開來。

          (2)從文件、流、系統(tǒng)ID、URL得到Document對象:
          DOMBuilder builder = new DOMBuilder();
          Document doc = builder.build(new File("jdom_test.xml"));

          SAXBuilder builder = new SAXBuilder();
          Document doc = builder.build(url);
          在新版本中DOMBuilder 已經(jīng)Deprecated掉 DOMBuilder.builder(url),用SAX效率會比較快。

          這里舉一個小例子,為了簡單起見,使用String對象直接作為xml數(shù)據(jù)源:

           public jdomTest() {
              String textXml = null;
              textXml = "<note>";
              textXml = textXml +
                  "<to>aaa</to><from>bbb</from><heading>ccc</heading><body>ddd</body>";
              textXml = textXml + "</note>";
              SAXBuilder builder = new SAXBuilder();
              Document doc = null;
              Reader in= new StringReader(textXml);
              try {
                doc = builder.build(in);
                Element root = doc.getRootElement();
                List ls = root.getChildren();//注意此處取出的是root節(jié)點(diǎn)下面的一層的Element集合
                for (Iterator iter = ls.iterator(); iter.hasNext(); ) {
                  Element el = (Element) iter.next();
                  if(el.getName().equals("to")){
                   System.out.println(el.getText());
                  }
                }
              }
              catch (IOException ex) {
                ex.printStackTrace();
              }
              catch (JDOMException ex) {
                ex.printStackTrace();
              }
            }

          很簡單把。


          (3)DOM的document和JDOM的Document之間的相互轉(zhuǎn)換使用方法,簡單!
          DOMBuilder builder = new DOMBuilder();
          org.jdom.Document jdomDocument = builder.build(domDocument);
          // work with the JDOM document…

          DOMOutputter converter = new DOMOutputter();
          org.w3c.dom.Document domDocument = converter.output(jdomDocument);
          // work with the DOM document…

          2.XML文檔輸出
          XMLOutPutter類:
          JDOM的輸出非常靈活,支持很多種io格式以及風(fēng)格的輸出
          Document doc = new Document(...);
          XMLOutputter outp = new XMLOutputter();
          // Raw output
          outp.output(doc, fileOutputStream);
          // Compressed output
          outp.setTextTrim(true);
          outp.output(doc, socket.getOutputStream());
          // Pretty output
          outp.setIndent(" ");
          outp.setNewlines(true);
          outp.output(doc, System.out);
          ......
          詳細(xì)請參閱最新的JDOM API手冊


          3.Element 類:
          (1)瀏覽Element樹
          //獲得根元素element
          Element root = doc.getRootElement();
          // 獲得所有子元素的一個list
          List allChildren = root.getChildren();
          // 獲得指定名稱子元素的list
          List namedChildren = root.getChildren("name");
          //獲得指定名稱的第一個子元素
          Element child = root.getChild("name");
          (這里的List是java.util.List)

          JDOM給了我們很多很靈活的使用方法來管理子元素
          List allChildren = root.getChildren();
          // 刪除第四個子元素
          allChildren.remove(3);
          // 刪除叫“jack”的子元素
          allChildren.removeAll(root.getChildren("jack"));

          root.removeChildren("jack"); // 便捷寫法
          // 加入
          allChildren.add(new Element("jane"));

          root.addContent(new Element("jane")); // 便捷寫法
          allChildren.add(0, new Element("first"));


          (2)移動Elements:
          在JDOM里很簡單
          Element movable = new Element("movable");
          parent1.addContent(movable); // place
          parent1.removeContent(movable); // remove
          parent2.addContent(movable); // add

          在Dom里
          Element movable = doc1.createElement("movable");
          parent1.appendChild(movable); // place
          parent1.removeChild(movable); // remove
          parent2.appendChild(movable); // 出錯!

          補(bǔ)充:
          糾錯性
          JDOM的Element構(gòu)造函數(shù)(以及它的其他函數(shù))會檢查element是否合法。
          而它的add/remove方法會檢查樹結(jié)構(gòu),檢查內(nèi)容如下:
          1.在任何樹中是否有回環(huán)節(jié)點(diǎn)
          2.是否只有一個根節(jié)點(diǎn)
          3.是否有一致的命名空間(Namespaces)

           

          (3)Element的text內(nèi)容讀取
          <description>
          A cool demo
          </description>

          // The text is directly available
          // Returns "\n A cool demo\n"
          String desc = element.getText();

          // There's a convenient shortcut
          // Returns "A cool demo"
          String desc = element.getTextTrim();

          (4)Elment內(nèi)容修改
          element.setText("A new description");
          3.可正確解釋特殊字符
          element.setText("<xml> content");
          4.CDATA的數(shù)據(jù)寫入、讀出
          element.addContent(new CDATA("<xml> content"));
          String noDifference = element.getText();

          混合內(nèi)容
          element可能包含很多種內(nèi)容,比如說

          <table>
          <!-- Some comment -->
          Some text
          <tr>Some child element</tr>
          </table>

          取table的子元素tr
          String text = table.getTextTrim();
          Element tr = table.getChild("tr");

          也可使用另外一個比較簡單的方法
          List mixedCo = table.getContent();
          Iterator itr = mixedCo.iterator();
          while (itr.hasNext()) {
          Object o = i.next();
          if (o instanceof Comment) {
          ...
          }
          // 這里可以寫成Comment, Element, Text, CDATA,ProcessingInstruction, 或者是EntityRef的類型
          }
          // 現(xiàn)在移除Comment,注意這里游標(biāo)應(yīng)為1。這是由于回車鍵也被解析成Text類的緣故,所以Comment項應(yīng)為1。
          mixedCo.remove(1);

           

          4.Attribute類
          <table width="100%" border="0"> </table>
          //獲得attribute
          String width = table.getAttributeValue("width");
          int border = table.getAttribute("width").getIntValue();
          //設(shè)置attribute
          table.setAttribute("vspace", "0");
          // 刪除一個或全部attribute
          table.removeAttribute("vspace");
          table.getAttributes().clear();

           

          5.處理指令(Processing Instructions)操作
          一個Pls的例子
          <?br?>
          <?cocoon-process type="xslt"?>
                    |        |
                    |        |
                  目標(biāo)     數(shù)據(jù)

          處理目標(biāo)名稱(Target)
          String target = pi.getTarget();
          獲得所有數(shù)據(jù)(data),在目標(biāo)(target)以后的所有數(shù)據(jù)都會被返回。
          String data = pi.getData();
          獲得指定屬性的數(shù)據(jù)
          String type = pi.getValue("type");
          獲得所有屬性的名稱
          List ls = pi.getNames();

          6.命名空間操作
          <xhtml:html
           xmlns:xhtml="
          <xhtml:title>Home Page</xhtml:title>
          </xhtml:html>

          Namespace xhtml = Namespace.getNamespace("xhtml", "List kids = html.getChildren("title", xhtml);
          Element kid = html.getChild("title", xhtml);
          kid.addContent(new Element("table", xhtml));

          7.XSLT格式轉(zhuǎn)換
          使用以下函數(shù)可對XSLT轉(zhuǎn)換
          最后如果你需要使用w3c的Document則需要轉(zhuǎn)換一下。
          public static Document transform(String stylesheet,Document in)
                                                  throws JDOMException {
               try {
                 Transformer transformer = TransformerFactory.newInstance()
                                       .newTransformer(new StreamSource(stylesheet));
                 JDOMResult out = new JDOMResult();
                 transformer.transform(new JDOMSource(in), out);
                 return out.getDeocument();
               }
               catch (TransformerException e) {
                 throw new JDOMException("XSLT Trandformation failed", e);
               }
             }

           


          僅列出標(biāo)題  
          主站蜘蛛池模板: 刚察县| 河池市| 安西县| 朝阳县| 蛟河市| 康定县| 和林格尔县| 大冶市| 南皮县| 崇仁县| 墨竹工卡县| 额尔古纳市| 新野县| 威远县| 盐津县| 巨鹿县| 偏关县| 泰安市| 米脂县| 边坝县| 泸水县| 田东县| 长岛县| 六安市| 宁德市| 高雄市| 花垣县| 连江县| 巩留县| 苍梧县| 瑞安市| 庆城县| 兴城市| 开平市| 家居| 宿迁市| 邵阳市| 平安县| 海宁市| 固镇县| 兰考县|