<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
    好東西啊!由衷的感謝樓主
    主站蜘蛛池模板: 国产亚洲精aa在线看| 亚洲宅男天堂a在线| 人妻免费久久久久久久了| 在线免费观看污网站| 亚洲精品永久在线观看| 成人免费一区二区三区在线观看| 亚洲AV无码一区二区三区人| 无码国产精品一区二区免费| 亚洲fuli在线观看| 免费黄色毛片视频| 色费女人18女人毛片免费视频| 四虎免费久久影院| 亚洲一区二区三区免费| 国产成人综合亚洲AV第一页| 18禁超污无遮挡无码免费网站| 亚洲日本va午夜中文字幕一区| 国产精品免费精品自在线观看| 在线综合亚洲欧洲综合网站| 亚洲国产电影av在线网址| 光棍天堂免费手机观看在线观看| 亚洲精品国产成人| 日韩免费视频网站| 中文字幕在线视频免费观看 | 婷婷国产偷v国产偷v亚洲| 丁香亚洲综合五月天婷婷| 九九热久久免费视频| 亚洲av色福利天堂| 丁香花免费完整高清观看| 亚洲丰满熟女一区二区哦| 亚洲黄片毛片在线观看| 一区二区三区福利视频免费观看| 亚洲成a人片在线观看精品| 又粗又大又猛又爽免费视频 | 亚洲午夜久久久精品影院| 国产精品免费观看久久| 日日狠狠久久偷偷色综合免费| 久久亚洲国产欧洲精品一| 成年女人18级毛片毛片免费 | 国产v亚洲v天堂a无| 亚洲裸男gv网站| 曰批全过程免费视频网址|