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

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

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

    posts - 22, comments - 32, trackbacks - 0, articles - 73
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    Java DOM 解析 XML詳解

    Posted on 2010-03-02 15:04 為自己代言 閱讀(20897) 評(píng)論(2)  編輯  收藏
     

    DOM解析器的接口已經(jīng)被W3C標(biāo)準(zhǔn)化了。org.w3.dom包包含了接口類型的定義,比如:

    DocumentElement等。不同的提供者,比如Apache OrganizationIBM都編寫(xiě)了實(shí)現(xiàn)這些接口的DOM解析器。SUN公司的XML處理JAVA APIJava API for XML Processing,JAXP

    庫(kù)實(shí)際上可以插入到這些解析器中的任意一個(gè)中。但是SUN公司也在JAVA SDK中包含了自己的DOM解析器。在本文中我使用的就是JAVA的解析器。

    1:要讀入一個(gè)XML文檔,首先要一個(gè)DocumentBuilder對(duì)象,可以這樣得到:

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    DocumentBuilder builder = factory.newDocumentBuilder();

    2:現(xiàn)在可以從文件中去讀取一個(gè)XML文件了(文件路徑:"F:""employees.xml"

        得到XML文件有三種方式:

    1:通過(guò)文件方式讀取:

    File file=new File("F:""employees.xml");

    Document doc=builder.parse(file);

    2:通過(guò)一個(gè)URL方式讀取:

     URL u=new URL("http://java.sun.com/index.html")

    Document doc=builder.parse(u);

    3:可以能過(guò)java IO 流的讀取:

           FileInputStream inputstream = new FileInputStream(

                      "F:""employees.xml");

        Document doc=builder.parse(inputstream);

    這里就寫(xiě)這么多了,在詳細(xì)的請(qǐng)自己去查查閱資料。

    下邊是employees.xml 這個(gè)XML文件的內(nèi)容:

        <?xml version="1.0" encoding="GBK"?>

    <employees>

    <employee email="zzzlyr@163.com">

    <name>李明</name>

    <sex>女孩子</sex>

    <age>30</age>

    </employee>

    <employee email="zzzlyr112@163.com">

    <name>張釗釗</name>

    <sex></sex>

    <age>28</age>

    </employee>

    </employees>

    publicvoid parseXml(String fileName) {

           try {

               DocumentBuilderFactory factory = DocumentBuilderFactory

                      .newInstance();

               DocumentBuilder builder = factory.newDocumentBuilder();

               Document document = builder.parse(fileName);

               // 1.獲得文檔根元素對(duì)對(duì)象;

               Element root = document.getDocumentElement();

               // 獲得文檔根元素下一級(jí)子元素所有元素;

               NodeList nodeList = root.getChildNodes();

               System.out.println(root.getNodeName());

               if (null != root) {

                  for (int i = 0; i < nodeList.getLength(); i++) {

                      Node child = nodeList.item(i);

                      // 輸出child的屬性;

                      System.out.println(child);

                     

    //                if (child.getNodeType() == Node.ELEMENT_NODE) {

    //                   System.out.println(child.getAttributes().getNamedItem(

    //                          "email").getNodeValue());

    //                }

    //

    //                for (Node node = child.getFirstChild(); node != null; node = node

    //                       .getNextSibling()) {

    //

    //                   if (node.getNodeType() == Node.ELEMENT_NODE) {

    //                       if ("name".equals(node.getNodeName())) {

    //                          System.out.println(node.getFirstChild()

    //                                 .getNodeValue());

    //                       }

    //                   }

    //                   if (node.getNodeType() == Node.ELEMENT_NODE) {

    //                       if ("sex".equals(node.getNodeName())) {

    //                           System.out.println(node.getFirstChild()

    //                                 .getNodeValue());

    //                       }

    //                   }

    //                   if (node.getNodeType() == Node.ELEMENT_NODE) {

    //                       if ("age".equals(node.getNodeName())) {

    //                          System.out.println(node.getFirstChild()

    //                                 .getNodeValue());

    //                       }

    //                   }

    //                }

                  }

               }

           } catch (ParserConfigurationException e) {

               e.printStackTrace();

           } catch (IOException e) {

               e.printStackTrace();

           } catch (SAXException e) {

               e.printStackTrace();

           }

        }

    我為了研究解析過(guò)程把寫(xiě)好的代碼注釋掉了,看這層輸出結(jié)果:

    employees

    [#text:

    ]

    [employee: null]

    [#text:

    ]

    [employee: null]

    [#text:

    ]

    第一個(gè)是整個(gè)文檔的根元素名稱,下邊結(jié)果是第一層for輸出結(jié)果,從結(jié)果可見(jiàn)而知

    遍歷了整個(gè)XML文件的所有子元素進(jìn)行輸出,如果不清楚可以和原XML文件對(duì)比可知

    去掉注釋部分結(jié)果如下:

    employees

    zzzlyr@163.com

    李明

    女孩子

    30

    zzzlyr112@163.com

    張釗釗

    28

    從結(jié)果可知,DOM解析過(guò)程是先解析整個(gè)XML文件所有子元素,然后在能過(guò)第二個(gè)for

    解析子元素下的子元素;

    但是為什么第一個(gè)有類似于這樣?xùn)|西[#text:] 這是查了半天資料,原因是XML 文件元素之間的空白字符也是一個(gè)元素,<employees></employees>這之間空白;

    child.getNodeType() == Node.ELEMENT_NODE代碼可以忽略掉類似于這樣?xùn)|西;

    這是解析,還有創(chuàng)建XML文檔,自己看代碼吧,我不多解釋了;

    整個(gè)代碼:

    package com.junhai.xml.test;

    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.PrintWriter;

    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerConfigurationException;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;

    import org.w3c.dom.Attr;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;

    import com.sun.org.apache.xerces.internal.util.XMLDocumentFilterImpl;

    public class DomXmlDemo extends XMLDocumentFilterImpl implements XmlDocument {
     private Document document;

     public void init() {
      try {
       DocumentBuilderFactory factory = DocumentBuilderFactory
         .newInstance();
       DocumentBuilder builder = factory.newDocumentBuilder();
       this.document = builder.newDocument();

      } catch (ParserConfigurationException e) {
       System.out.println(e.getMessage());
      }
     }

     public void createXml(String fileName) {
      this.init();
      // 創(chuàng)建XML文件根節(jié)點(diǎn);
      Element root = this.document.createElement("employees");
      this.document.appendChild(root);
      // 創(chuàng)建XML文件根節(jié)點(diǎn)子節(jié)點(diǎn);
      Element employee = this.document.createElement("employee");
      // 向根節(jié)點(diǎn)添加屬性節(jié)點(diǎn);
      Attr email = this.document.createAttribute("email");
      email.setNodeValue("zzzlyr@163.com");
      // 把屬性節(jié)點(diǎn)對(duì)象,追加到達(dá)根節(jié)點(diǎn)上去;
      employee.setAttributeNode(email);

      Element name = this.document.createElement("name");
      // 向XML文件根節(jié)點(diǎn)子節(jié)點(diǎn)追加數(shù)據(jù);
      name.appendChild(this.document.createTextNode("李明"));

      // 在把子節(jié)點(diǎn)的屬性追加到子節(jié)點(diǎn)中元素中去;
      employee.appendChild(name);

      Element sex = this.document.createElement("sex");
      sex.appendChild(this.document.createTextNode("女孩子"));
      employee.appendChild(sex);

      Element age = this.document.createElement("age");
      age.appendChild(this.document.createTextNode("30"));
      employee.appendChild(age);
      root.appendChild(employee);

      
     
      // 創(chuàng)建XML文件根節(jié)點(diǎn)子節(jié)點(diǎn);
      Element employee2 = this.document.createElement("employee");
      // 向根節(jié)點(diǎn)添加屬性節(jié)點(diǎn);
      Attr email2 = this.document.createAttribute("email");
      email2.setNodeValue("zzzlyr2@163.com");
      // 把屬性節(jié)點(diǎn)對(duì)象,追加到達(dá)根節(jié)點(diǎn)上去;
      employee2.setAttributeNode(email2);
      Element name2 = this.document.createElement("name");
      // 向XML文件根節(jié)點(diǎn)子節(jié)點(diǎn)追加數(shù)據(jù);
      name2.appendChild(this.document.createTextNode("張釗釗"));

      // 在把子節(jié)點(diǎn)的屬性追加到子節(jié)點(diǎn)中元素中去;
      employee2.appendChild(name2);

      Element sex2 = this.document.createElement("sex");
      sex2.appendChild(this.document.createTextNode("男"));
      employee2.appendChild(sex2);

      Element age2 = this.document.createElement("age");
      age2.appendChild(this.document.createTextNode("28"));
      employee2.appendChild(age2);
      root.appendChild(employee2);
      
      
      
      
      
      TransformerFactory tf = TransformerFactory.newInstance();
      try {
       Transformer transformer = tf.newTransformer();
       // Transformer transformer1=tf.newTransformer(Source source);
       DOMSource source = new DOMSource(document);
       transformer.setOutputProperty(OutputKeys.ENCODING, "GBK");
       transformer.setOutputProperty(OutputKeys.INDENT, "yes");
       try {
        PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
        StreamResult result = new StreamResult(pw);
        transformer.transform(source, result);
        System.out.println("生成XML文件成功!");

       } catch (FileNotFoundException e) {
        e.printStackTrace();
        System.out.println("文件沒(méi)有找到!");
       } catch (TransformerException e) {
        e.printStackTrace();
        System.out.println("生成XML文件失敗!");
       }

      } catch (TransformerConfigurationException e) {
       e.printStackTrace();
      }

     }

     public void parseXml(String fileName) {
      try {
       DocumentBuilderFactory factory = DocumentBuilderFactory
         .newInstance();
       DocumentBuilder builder = factory.newDocumentBuilder();
       Document document = builder.parse(fileName);
       // 1.獲得文檔根元素對(duì)對(duì)象;
       Element root = document.getDocumentElement();
       // 獲得文檔根元素下一級(jí)子元素所有元素;
       NodeList nodeList = root.getChildNodes();
       System.out.println(root.getNodeName());
       if (null != root) {
        for (int i = 0; i < nodeList.getLength(); i++) {
         Node child = nodeList.item(i);
         // 輸出child的屬性;
         //System.out.println(child);
         
         if (child.getNodeType() == Node.ELEMENT_NODE) {
          System.out.println(child.getAttributes().getNamedItem(
            "email").getNodeValue());
         }

         for (Node node = child.getFirstChild(); node != null; node = node
           .getNextSibling()) {

          if (node.getNodeType() == Node.ELEMENT_NODE) {
           if ("name".equals(node.getNodeName())) {
            System.out.println(node.getFirstChild()
              .getNodeValue());
           }
          }
          if (node.getNodeType() == Node.ELEMENT_NODE) {
           if ("sex".equals(node.getNodeName())) {
            System.out.println(node.getFirstChild()
              .getNodeValue());
           }
          }
          if (node.getNodeType() == Node.ELEMENT_NODE) {
           if ("age".equals(node.getNodeName())) {
            System.out.println(node.getFirstChild()
              .getNodeValue());
           }
          }
         }
        }
       }

      } catch (ParserConfigurationException e) {
       e.printStackTrace();
      } catch (IOException e) {
       e.printStackTrace();
      } catch (SAXException e) {
       e.printStackTrace();
      }

     }

     public static void main(String[] args) {
      DomXmlDemo dom = new DomXmlDemo();
       dom.createXml("F:\\employees.xml");
      dom.parseXml("F:\\employees.xml");
     }
    }





    結(jié)果如下:

    生成XML文件成功!
    employees
    zzzlyr@163.com
    李明
    女孩子
    30
    zzzlyr2@163.com
    張釗釗



    評(píng)論

    # re: Java DOM 解析 XML詳解[未登錄](méi)  回復(fù)  更多評(píng)論   

    2015-04-21 16:29 by 1
    1

    # re: Java DOM 解析 XML詳解  回復(fù)  更多評(píng)論   

    2015-09-20 00:57 by szm
    Great!

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲AV成人精品日韩一区| 国产精品黄页在线播放免费| 美女羞羞视频免费网站| 亚洲国产精品综合久久网各| 亚洲Av无码乱码在线观看性色| 99久久99久久精品免费看蜜桃| 中文字幕一区二区三区免费视频 | selaoban在线视频免费精品| 中中文字幕亚洲无线码| 亚洲国产综合专区电影在线| 亚洲日韩中文字幕在线播放| 免费国产在线观看老王影院| 午夜毛片不卡高清免费| 9久9久女女免费精品视频在线观看| 免费日本一区二区| 中文字幕在线成人免费看| 美女黄频免费网站| 亚洲AV无码男人的天堂| 亚洲色精品三区二区一区| 亚洲国产美女福利直播秀一区二区| 亚洲男人第一av网站| 国产v亚洲v天堂无码网站| 国产亚洲精品看片在线观看 | 一级做a爰片久久毛片免费陪 | 在线免费播放一级毛片| 中文字幕成人免费高清在线视频| 日韩毛片一区视频免费| 黄色片网站在线免费观看| 亚洲成a人片在线不卡一二三区 | 成年女人午夜毛片免费视频 | 国产亚洲一卡2卡3卡4卡新区 | 成人毛片18女人毛片免费96| av免费不卡国产观看| 手机看黄av免费网址| 国产情侣激情在线视频免费看 | 亚洲精品综合在线影院| 精品亚洲AV无码一区二区三区 | 最近中文字幕无免费| 3344永久在线观看视频免费首页| 99re热精品视频国产免费| 91精品国产免费入口|