FORTUNE

          THE WAY TO THE MASTER...
          posts - 49, comments - 18, trackbacks - 0, articles - 1
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Dom4j 學(xué)習(xí)筆記

          Posted on 2006-03-22 17:50 fortune 閱讀(791) 評(píng)論(1)  編輯  收藏 所屬分類: java技術(shù)

          Dom4j 學(xué)習(xí)筆記
          The dom4j Project Homepage: http://www.dom4j.org

          Loading XML Data
          以下代碼從File中或一個(gè)URL中讀取一個(gè)XML文件,并產(chǎn)生一個(gè)Document對(duì)象。一個(gè)Document對(duì)象表示了內(nèi)存中的一棵XML樹(shù),可以在這個(gè)XML樹(shù)中進(jìn)行遍歷、查詢、修改等操作。


          import java.io.*;
          import java.net.*;
          import org.dom4j.Document;
          import org.dom4j.DocumentException;
          import org.dom4j.io.SAXReader;

          public class XMLLoader {
          ???
          ??? private Document doc = null;
          ???
          ??? public void parseWithSAX(File file)
          ??? throws MalformedURLException, DocumentException {
          ??????? SAXReader xmlReader = new SAXReader();
          ??????? this.doc = xmlReader.read(file);
          ??????? return;
          ??? }
          ???
          ??? public void parseWithSAX(URL url)
          ??? throws MalformedURLException, DocumentException {
          ??????? SAXReader xmlReader = new SAXReader();
          ??????? this.doc = xmlReader.read(url);
          ??????? return;
          ??? }
          }
          ???????
          QName and Namespace
          QName對(duì)象表示了一個(gè)XML元素或?qū)傩缘膓ualified name,即一個(gè)namespace和一個(gè)local name的二元組。

          Namespace對(duì)象表示了QName二元組中的namespace部分,它由prefix和URI兩部分組成。


          /******************** SAMPLE XML FILE *************************
          ? <heavyz:Sample
          ??? xmlns:heavyz="??? <heavyz:HelloWorld/>
          ? </heavyz:Sample>
          ? *************************************************************/
          ?
          public void printRootQNameInfo(Document doc) {
          ??? Element root = doc.getRootElement();
          ??? QName qname = root.getQName();
          ??? System.out.println("local name????? : " + qname.getName());
          ??? System.out.println("namespace prefix: " + qname.getNamespacePrefix());
          ??? System.out.println("namespace URI?? : " + qname.getNamespaceURI());
          ??? System.out.println("qualified name? : " + qname.getQualifiedName());
          ??? return;
          }

          /************************* OUTPUT *****************************
          ? localname?????? : Sample
          ? namespace prefix: heavyz
          ? namespace URI?? :
          http://www.heavyzheng.com/schema/sample.xsd
          ? qualified name? : heavyz:Sample
          ? *************************************************************/
          ???????
          可以調(diào)用Namespace(String prefix, String uri)構(gòu)造方法構(gòu)造一個(gè)新的Namespace對(duì)象;也可以調(diào)用Namespace.get(String prefix, String uri)靜態(tài)方法獲得一個(gè)新的Namespace對(duì)象。

          可以調(diào)用QName(String name)構(gòu)造方法構(gòu)造一個(gè)沒(méi)有namespace的qualified name;或者調(diào)用QName(String name, Namespace namespace)構(gòu)造方法構(gòu)造一個(gè)有namespace的qualified name。

          Navigating Through an XML Tree
          對(duì)Document對(duì)象調(diào)用getRootElement()方法可以返回代表根節(jié)點(diǎn)的Element對(duì)象。擁有了一個(gè)Element對(duì)象后,可以對(duì)該對(duì)象調(diào)用elementIterator()方法獲得它的子節(jié)點(diǎn)的Element對(duì)象們的一個(gè)iterator。使用(Element)iterator.next()方法遍歷一個(gè)iterator并把每個(gè)取出的元素轉(zhuǎn)化為Element類型。

          通過(guò)遞歸的方法,以下代碼可以根據(jù)Document對(duì)象打印出完整的XML樹(shù)。


          public void printXMLTree(Document doc) {
          ??? Element root = doc.getRootElement();
          ??? printElement(root,0);
          ??? return;
          }
          ???
          private void printElement(Element element, int level) {
          ??? // print indent
          ??? for (int i=0; i<level; i++) {
          ??????? System.out.print(" ");
          ??? }
          ??? System.out.println(element.getQualifiedName());
          ??? Iterator iter = element.elementIterator();
          ??? while (iter.hasNext()) {
          ??????? Element sub = (Element)iter.next();
          ??????? printElement(sub,level+2);
          ??? }
          ??? return;
          }
          ???????
          Getting Information from an Element
          可以通過(guò)Element類提供的方法訪問(wèn)一個(gè)XML元素中含有的信息: Method Comment
          getQName() 元素的QName對(duì)象
          getNamespace() 元素所屬的Namespace對(duì)象
          getNamespacePrefix() 元素所屬的Namespace對(duì)象的prefix
          getNamespaceURI() 元素所屬的Namespace對(duì)象的URI
          getName() 元素的local name
          getQualifiedName() 元素的qualified name
          getText() 元素所含有的text內(nèi)容,如果內(nèi)容為空則返回一個(gè)空字符串而不是null
          getTextTrim() 元素所含有的text內(nèi)容,其中連續(xù)的空格被轉(zhuǎn)化為單個(gè)空格,該方法不會(huì)返回null
          attributeIterator() 元素屬性的iterator,其中每個(gè)元素都是Attribute對(duì)象
          attributeValue() 元素的某個(gè)指定屬性所含的值
          elementIterator() 元素的子元素的iterator,其中每個(gè)元素都是Element對(duì)象
          element() 元素的某個(gè)指定(qualified name或者local name)的子元素
          elementText() 元素的某個(gè)指定(qualified name或者local name)的子元素中的text信息
          getParent 元素的父元素
          getPath() 元素的XPath表達(dá)式,其中父元素的qualified name和子元素的qualified name之間使用"/"分隔
          isTextOnly() 是否該元素只含有text或是空元素
          isRootElement() 是否該元素是XML樹(shù)的根節(jié)點(diǎn)


          要取出Element對(duì)象中某個(gè)屬性的信息,可以調(diào)用attributeIterator()方法獲得一個(gè)Attribute對(duì)象的iterator,然后再遍歷它。也可以直接調(diào)用attributeValue()方法獲得指定屬性的值。該方法接受四種類型的參數(shù):

          attributeValue(QName qname):通過(guò)指定qualified name獲得屬性值,如果無(wú)法找到指定的屬性,則返回null。
          attributeValue(QName qname, String defaultValue):通過(guò)指定qualified name獲得屬性值,如果無(wú)法找到指定的屬性,則返回defaultValue。
          attributeValue(String name):通過(guò)指定local name獲得屬性值,而忽略屬性的namespace,如果無(wú)法找到指定的屬性,則返回null。
          attributeValue(String name, String defaultValue):通過(guò)指定local name獲得屬性值,而忽略屬性的namespace,如果無(wú)法找到指定的屬性,則返回defaultValue。

          對(duì)于一個(gè)Attribute對(duì)象,可以使用它的以下方法訪問(wèn)其中的信息: Method Comment
          getQName() 屬性的QName對(duì)象
          getNamespace() 屬性所屬的Namespace對(duì)象
          getNamespacePrefix() 屬性所屬的Namespace對(duì)象的prefix
          getNamespaceURI() 屬性所屬的Namespace對(duì)象的URI
          getName() 屬性的local name
          getQualifiedName() 屬性的qualified name
          getValue() 屬性的值


          Writing an XML Tree to OutputStream
          Dom4j通過(guò)XMLWriter將由Document對(duì)象表示的XML樹(shù)寫入一個(gè)文件,并使用OutputFormat格式對(duì)象指定寫入的風(fēng)格和編碼方法。調(diào)用OutputFormat.createPrettyPrint()方法可以獲得一個(gè)默認(rèn)的pretty print風(fēng)格的格式對(duì)象。對(duì)OutputFormat對(duì)象調(diào)用setEncoding()方法可以指定XML文件的編碼方法。


          public void writeTo(OutputStream out, String encoding)
          throws UnsupportedEncodingException, IOException {
          ??? OutputFormat format = OutputFormat.createPrettyPrint();
          ??? format.setEncoding("gb2312");
          ??? XMLWriter writer = new XMLWriter(System.out,format);
          ??? writer.write(doc);
          ??? writer.flush();
          ??? return;
          }
          ???????
          Creating an XML Tree
          使用DocumentFactory對(duì)象創(chuàng)建一個(gè)空的Document對(duì)象。DocumentFactory對(duì)象由DocumentFactory.getInstance()靜態(tài)方法產(chǎn)生。對(duì)Document對(duì)象調(diào)用addElement()方法將創(chuàng)建XML根節(jié)點(diǎn),并將該節(jié)點(diǎn)返回。也可以手工創(chuàng)建一個(gè)Element對(duì)象并調(diào)用Document.setRootElement()方法把它設(shè)置為根節(jié)點(diǎn)


          import org.dom4j.DocumentFactory;
          import org.dom4j.Document;
          import org.dom4j.Element;

          public class XMLSaver {
          ???
          ??? private DocumentFactory factory = null;
          ??? private Document doc = null;
          ??? private Element root = null;
          ???
          ??? public XMLSaver() {
          ??????? factory = DocumentFactory.getInstance();
          ??????? doc = factory.createDocument();
          ??? }
          ???
          ??? public Element generateRoot(String name) {
          ??????? root = doc.addElement(name);
          ??????? return root;
          ??? }
          ???
          ??? public Element generateRoot(QName qname) {
          ??????? root = doc.addElement(qname);
          ??????? return root;
          ??? }
          ???
          ??? public Element generateRoot(Element element) {
          ??????? doc.setRootElement(element);
          ??????? root = element;
          ??????? return root;
          ??? }
          }
          ???????
          Adding Information into an Element
          Element通過(guò)addElement()為自己增加一個(gè)子節(jié)點(diǎn)到當(dāng)前所有子節(jié)點(diǎn)的后面。該方法可以接受三種不同類型的參數(shù):(QName qname)、(String name)或者(String qualifiedName, String namespaceURI)。該方法返回增加的子節(jié)點(diǎn)的Element對(duì)象。

          Element通過(guò)addAttribute()為自己增加屬性。該方法可以接受兩種不同類型的參數(shù):(QName qname, String value)或者(String name, String value)。該方法返回自身的Element對(duì)象。

          Element通過(guò)addText()為自己增加文本內(nèi)容。該方法只接受String類型參數(shù),并返回自身的Element對(duì)象。


          public void addAuthors(Element bookElement) {

          ??? Element author1 = bookElement.addElement("author");
          ??? author1.addAttribute("name","Toby");
          ??? author1.addAttribute("location","Germany");
          ??? author1.addText("Tobias Rademacher");

          ??? Element author2 = bookElement.addElement("author");
          ??? author2.addAttribute("name","James");
          ??? author2.addAttribute("name","UK");
          ??? author2.addText("James Strachan");
          ???
          ??? return;
          }
          ???????
          Deleting Elements and Attributes
          要?jiǎng)h除XML樹(shù)上的一棵子樹(shù),首先要找到該子樹(shù)的根節(jié)點(diǎn),然后對(duì)該節(jié)點(diǎn)調(diào)用detach()方法。注意:如果對(duì)根節(jié)點(diǎn)調(diào)用了detach()方法,將導(dǎo)致該XML樹(shù)不再完整(一個(gè)XML文件需要有且僅有一個(gè)根節(jié)點(diǎn))。


          public void deleteSubtree(Element subtreeRoot) {
          ??? subtreeRoot.detach();
          ??? return;
          }
          ???????
          要清除Element下的所有子節(jié)點(diǎn)(包括Element和text),可以對(duì)該Element調(diào)用clearContent()方法。該方法不會(huì)清除Element的屬性。

          要清除Element下的某個(gè)Attribute,首先要獲得該Attribute對(duì)象,然后把它作為參數(shù)調(diào)用Element的remove()方法。

          Updating an Attribute
          要更新一個(gè)屬性的內(nèi)容,首先要獲得該Attribute對(duì)象,然后可以調(diào)用setNamespace()方法更新它所屬的namespace;調(diào)用setValue()方法更新它的屬性值。

          Updating an Element's Text
          可以對(duì)一個(gè)Element對(duì)象調(diào)用isTextOnly()方法判斷它是否只含有text或者是空節(jié)點(diǎn)。對(duì)Element對(duì)象調(diào)用addText()方法將把一個(gè)字符串附加到Element中,但不會(huì)修改它原來(lái)?yè)碛械膖ext或者子節(jié)點(diǎn)。如果Element是isTextOnly(),要修改原來(lái)含有的text,可以先調(diào)用clearContent(),再調(diào)用addText()并把新值傳入。


          public void updateText(Element element, String newText) {
          ??? if (element.isTextOnly()) {
          ??????? element.clearContent();
          ??????? element.addText(newText);
          ??? }
          ??? return;
          }


          評(píng)論

          # re: Dom4j 學(xué)習(xí)筆記   回復(fù)  更多評(píng)論   

          2006-10-24 20:57 by angel
          好東西啊!由衷的感謝樓主
          主站蜘蛛池模板: 磐安县| 商丘市| 仁寿县| 宁强县| 三江| 江阴市| 观塘区| 邵东县| 乌兰县| 唐海县| 平遥县| 四平市| 垣曲县| 都安| 固安县| 基隆市| 钦州市| 绍兴市| 乐平市| 九龙城区| 错那县| 大姚县| 昆山市| 三都| 镇远县| 沂南县| 海晏县| 章丘市| 两当县| 乌兰浩特市| 台山市| 鄂托克旗| 西峡县| 江达县| 石柱| 乌兰浩特市| 亳州市| 锦屏县| 米易县| 资阳市| 临湘市|