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

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

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

    FORTUNE

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

    Dom4j 學習筆記

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

    Dom4j 學習筆記
    The dom4j Project Homepage: http://www.dom4j.org

    Loading XML Data
    以下代碼從File中或一個URL中讀取一個XML文件,并產生一個Document對象。一個Document對象表示了內存中的一棵XML樹,可以在這個XML樹中進行遍歷、查詢、修改等操作。


    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對象表示了一個XML元素或屬性的qualified name,即一個namespace和一個local name的二元組。

    Namespace對象表示了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
    ? *************************************************************/
    ???????
    可以調用Namespace(String prefix, String uri)構造方法構造一個新的Namespace對象;也可以調用Namespace.get(String prefix, String uri)靜態方法獲得一個新的Namespace對象。

    可以調用QName(String name)構造方法構造一個沒有namespace的qualified name;或者調用QName(String name, Namespace namespace)構造方法構造一個有namespace的qualified name。

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

    通過遞歸的方法,以下代碼可以根據Document對象打印出完整的XML樹。


    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
    可以通過Element類提供的方法訪問一個XML元素中含有的信息: Method Comment
    getQName() 元素的QName對象
    getNamespace() 元素所屬的Namespace對象
    getNamespacePrefix() 元素所屬的Namespace對象的prefix
    getNamespaceURI() 元素所屬的Namespace對象的URI
    getName() 元素的local name
    getQualifiedName() 元素的qualified name
    getText() 元素所含有的text內容,如果內容為空則返回一個空字符串而不是null
    getTextTrim() 元素所含有的text內容,其中連續的空格被轉化為單個空格,該方法不會返回null
    attributeIterator() 元素屬性的iterator,其中每個元素都是Attribute對象
    attributeValue() 元素的某個指定屬性所含的值
    elementIterator() 元素的子元素的iterator,其中每個元素都是Element對象
    element() 元素的某個指定(qualified name或者local name)的子元素
    elementText() 元素的某個指定(qualified name或者local name)的子元素中的text信息
    getParent 元素的父元素
    getPath() 元素的XPath表達式,其中父元素的qualified name和子元素的qualified name之間使用"/"分隔
    isTextOnly() 是否該元素只含有text或是空元素
    isRootElement() 是否該元素是XML樹的根節點


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

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

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


    Writing an XML Tree to OutputStream
    Dom4j通過XMLWriter將由Document對象表示的XML樹寫入一個文件,并使用OutputFormat格式對象指定寫入的風格和編碼方法。調用OutputFormat.createPrettyPrint()方法可以獲得一個默認的pretty print風格的格式對象。對OutputFormat對象調用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對象創建一個空的Document對象。DocumentFactory對象由DocumentFactory.getInstance()靜態方法產生。對Document對象調用addElement()方法將創建XML根節點,并將該節點返回。也可以手工創建一個Element對象并調用Document.setRootElement()方法把它設置為根節點


    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通過addElement()為自己增加一個子節點到當前所有子節點的后面。該方法可以接受三種不同類型的參數:(QName qname)、(String name)或者(String qualifiedName, String namespaceURI)。該方法返回增加的子節點的Element對象。

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

    Element通過addText()為自己增加文本內容。該方法只接受String類型參數,并返回自身的Element對象。


    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
    要刪除XML樹上的一棵子樹,首先要找到該子樹的根節點,然后對該節點調用detach()方法。注意:如果對根節點調用了detach()方法,將導致該XML樹不再完整(一個XML文件需要有且僅有一個根節點)。


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

    要清除Element下的某個Attribute,首先要獲得該Attribute對象,然后把它作為參數調用Element的remove()方法。

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

    Updating an Element's Text
    可以對一個Element對象調用isTextOnly()方法判斷它是否只含有text或者是空節點。對Element對象調用addText()方法將把一個字符串附加到Element中,但不會修改它原來擁有的text或者子節點。如果Element是isTextOnly(),要修改原來含有的text,可以先調用clearContent(),再調用addText()并把新值傳入。


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


    評論

    # re: Dom4j 學習筆記   回復  更多評論   

    2006-10-24 20:57 by angel
    好東西啊!由衷的感謝樓主
    主站蜘蛛池模板: 亚洲精品中文字幕无码AV| 亚洲日韩v无码中文字幕| 亚洲第一精品电影网| 午夜不卡久久精品无码免费 | 亚洲日韩一区二区三区| 亚洲一区二区三区免费在线观看| 亚洲色欲色欲综合网站| 91大神免费观看| 亚洲激情电影在线| 成人免费午间影院在线观看| 亚洲乱人伦精品图片| 成人毛片免费播放| 亚洲AV无码专区亚洲AV桃| 国产高清免费观看| 女人裸身j部免费视频无遮挡| 亚洲一级Av无码毛片久久精品 | 十九岁在线观看免费完整版电影| 国产精品亚洲一区二区三区在线| 国产一区二区三区免费| 亚洲国产人成在线观看69网站 | 亚洲高清免费视频| 亚洲色欲久久久综合网东京热| 三级网站免费观看| 亚洲经典在线观看| 免费a级毛片高清视频不卡 | 青春禁区视频在线观看直播免费 | 亚洲一区二区免费视频| 亚洲欧美精品午睡沙发| 国产免费av片在线无码免费看| 在线播放免费人成视频网站 | 亚洲性线免费观看视频成熟| 国产精品高清全国免费观看| 国产精品1024在线永久免费| 亚洲综合一区二区精品久久| 国产成人aaa在线视频免费观看| 国产精品免费久久久久影院| 亚洲精品国产电影午夜| 国产精品色午夜免费视频| 国产一区二区三区免费观看在线| 亚洲宅男精品一区在线观看| 亚洲精品亚洲人成在线观看下载|