你的位置:首页 > Java教程

[Java教程]Java从零开始学四十二(DOM解析XML)


一、DOM解析

 

favorite.

<??><PhoneInfo name="手机品牌">  <Brand name="华为">    <Type name="U8650">    </Type>  </Brand>  <Brand name="三星">    <Type name="i9100G">    </Type>    <Type name="I9108">    </Type>  </Brand>  <Brand name="Apple">    <Type name="iPhone4">    </Type>  </Brand></PhoneInfo>

解析

public static void getItemtry {      // 1.得到DOM解析器的工厂      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();      // 2.得到DOM工厂获得DOM解析器      DocumentBuilder db = dbf.newDocumentBuilder();      // 3.解析      Document doc = db.parse(");      // 4.得到所有<Brand>节点列表信息      NodeList brandList = doc.getElementsByTagName("Brand");      // 5.循环Brand信息      for (int i = 0; i < brandList.getLength(); i++) {        Node brandNode = brandList.item(i);        // 类型转换        Element brandElement = (Element) brandNode;        // 获取Brand的Name属性        String brandName = brandElement.getAttribute("name");        System.out.println("手机品牌:" + brandName);        // 获取Brand的子节点        NodeList typeList = brandNode.getChildNodes();        for (int j = 0; j < typeList.getLength(); j++) {          // 判断是否为Elemnet 可能有空字符串          if (typeList.item(j) instanceof Element) {            // 遍历            Element typeElement = (Element) typeList.item(j);            // 型号            String typeName = typeElement.getAttribute("name");            // 输出            System.out.println("手机型号 :" + typeName);          }        }      }    } catch (Exception e) {      e.printStackTrace();    }  }

有文本内容的解析

网易手机各地行情.

<??><??><rss version="2.0">  <channel>    <title>网易手机各地行情</title>    <link>http://tech.163.com/mobile/special/00111SJM/sjhq_gd.html</link>    <description>全国其他地区手机行情</description>       <item>          <title><![CDATA[超高性价比智能机 华为 U8650 仅1280元]]></title>          <link>http://tech.163.com/mobile/11/1115/12/7ITDEDDA00112K8C.html</link>          <description><![CDATA[U8650是华为今年推出的一款3G智能手机,该机搭载Android OS 2.3系统,采用3.5英寸480×320像素的触控屏,内置320万像素CMOS摄像头,还具备双512MB内存,整机性能非常不错。其轻,薄的特点,很适合女性使用。感兴趣的朋友不妨来关注一下吧。近日该机在经销商处有售,售价为880元。            手机最新价格变动 ]]>......</description>          <pubDate>2011-11-25 12:50:46</pubDate>       </item>       <item>          <title><![CDATA[超高性价比智能机 华为 U8650 仅1800元]]></title>          <link>http://tech.163.com/mobile/11/1115/12/7ITDEDDA00112K8C.html</link>          <description><![CDATA[U8650是华为今年推出的一款3G智能手机,该机搭载Android OS 2.3系统,采用3.5英寸480×320像素的触控屏,内置320万像素CMOS摄像头,还具备双512MB内存,整机性能非常不错。其轻,薄的特点,很适合女性使用。感兴趣的朋友不妨来关注一下吧。近日该机在经销商处有售,售价为880元。            手机最新价格变动 ]]>......</description>          <pubDate>2011-11-20 12:50:46</pubDate>       </item>    <item id="1">      <title><![CDATA[800万双网双待摩托罗拉XT882卖3950]]></title>      <link>http://tech.163.com/mobile/11/1115/13/7ITGR17S00112K8C.html</link>      <description><![CDATA[摩托罗拉XT882是一款支持3G双网双核的智能手机,配备了1G双核Tegra 2处理器、全新的Android 2.3操作系统、4.0英寸qHD高清晰电容屏幕、1080P高清视频播放及输出、8GB超大机身内存……今天小编从卖场商家处获悉,800万双网双待摩托罗拉XT882卖3950元,喜欢的朋友不妨来围观一下吧。在外观上,摩托XT882在外形方面和Atrix 4G基 ]]>......</description>      <pubDate>2011-11-15 13:50:45</pubDate>    </item>    <item id="GUID" read="true">      <title><![CDATA[感恩节又放价 三星i9100G行货3999元]]></title>      <link>http://tech.163.com/mobile/11/1115/13/7ITGQV8V00112K8C.html</link>      <description><![CDATA[三星i9100G是近期上市的一款智能手机,1.2GHz主频双核处理器的加入为整机流畅运行提供了最有利保证,整体表现十分出色。三星i9100G正面搭载一块4.3英寸分辨率为480×800像素触控屏,并且采用了Super AMOLED PLUS材质,无论是色彩饱和度以及艳丽程度都比I9000的Super AMOLED出色。此外,在机身背面它还内置一枚800万像素的摄 ]]>......</description>      <pubDate>2011-11-15 13:50:45</pubDate>    </item>    <item id="3">      <title><![CDATA[刺激享受 大屏双核机 HTC G19仅3500]]></title>      <link>http://tech.163.com/mobile/11/1115/12/7ITDEFIP00112K8C.html</link>      <description><![CDATA[HTC的G系列一直是人们最为关注的,在性能上不断的更新让人们享受到了更为强劲的使用性能。G19是HTC前段时间推出的一款4G智能机,搭载Android OS 2.3系统,采用1536MHz的双核处理器,还配有4.5英寸的触控屏,800万像素摄像头,绝对是一款目前最为强劲的实力机型。感兴趣的朋友不妨来关注一下吧。              ]]>......</description>      <pubDate>2011-11-15 12:50:46</pubDate>    </item>    <item id="4">      <title><![CDATA[典雅典范 为时尚代言 索爱X8仅980元]]></title>      <link>http://tech.163.com/mobile/11/1115/12/7ITDEE6U00112K8C.html</link>      <description><![CDATA[时尚几乎就是专门为X8而设的词语,它是索尼爱立信推出的一款智能手机,小巧的机身,时尚又不失典雅高端的气质,搭载主流的Android 2.1系统,采用600MHz的高通 MSM7227处理器,还内置了320万像素的摄像头,带来不错的使用体验。感兴趣的朋友不妨来关注一下吧。            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]]>......</description>      <pubDate>2011-11-15 12:50:46</pubDate>    </item>    <item id="5">      <title><![CDATA[高性价比智能机 华为 U8650 仅880元]]></title>      <link>http://tech.163.com/mobile/11/1115/12/7ITDEDDA00112K8C.html</link>      <description><![CDATA[U8650是华为今年推出的一款3G智能手机,该机搭载Android OS 2.3系统,采用3.5英寸480×320像素的触控屏,内置320万像素CMOS摄像头,还具备双512MB内存,整机性能非常不错。其轻,薄的特点,很适合女性使用。感兴趣的朋友不妨来关注一下吧。近日该机在经销商处有售,售价为880元。            手机最新价格变动 ]]>......</description>      <pubDate>2011-11-15 12:50:46</pubDate>    </item>  </channel></rss>

解析

  public static List<Item> getItems(){    try {            //创建DocumentBuilderFactory      DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();      //创建DocumentBuilder      DocumentBuilder  db = dbf.newDocumentBuilder();      //创建Documnet      Document doc=db.parse(");      //获取节点      NodeList itemList=doc.getElementsByTagName("item");      for(int i=0;i<itemList.getLength();i++){        Element item=(Element)itemList.item(i);        String id=item.getAttribute("id");        //System.out.println("编号"+id);        String title=item.getElementsByTagName("title").item(0).getFirstChild().getNodeValue();        String link=item.getElementsByTagName("link").item(0).getFirstChild().getNodeValue();        String description=item.getElementsByTagName("description").item(0).getFirstChild().getNodeValue();        String pubDate=item.getElementsByTagName("pubDate").item(0).getFirstChild().getNodeValue();        //System.out.println("标题: "+title+"\t\t连接:  "+link+"\t\t描述: "+description+"\t\t 发布日期:"+pubDate);            }    } catch (ParserConfigurationException e) {      e.printStackTrace();    } catch (SAXException e) {      e.printStackTrace();    } catch (IOException e) {      e.printStackTrace();    }      }

 

二、增加
// 增加新的节点 增加小米  public static void savePhone() {    try {      // 1.创建DocumentBuilderFactory      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();      // 2.创建DocumentBuilder      DocumentBuilder db = dbf.newDocumentBuilder();      // 3.创建Document      Document doc = db.parse(");      // 创建新的节点      Element brandElement = doc.createElement("Brand");      brandElement.setAttribute("name", "小米");      // 创建type子节点      Element typeElement1 = doc.createElement("Type");      Element typeElement2 = doc.createElement("Type");      typeElement1.setAttribute("name", "红米");      typeElement2.setAttribute("name", "米4");      brandElement.appendChild(typeElement1);      brandElement.appendChild(typeElement2);      // 找到根节点      Element PhoneInfo = (Element) doc.getElementsByTagName("PhoneInfo")          .item(0);      PhoneInfo.appendChild(brandElement);      // 保存      TransformerFactory trf = TransformerFactory.newInstance();      Transformer tf = trf.newTransformer();      // 数据源      DOMSource ds = new DOMSource(doc);      // 设置编码类型      tf.setOutputProperty(OutputKeys.ENCODING, "utf-8");      // 设置流      FileOutputStream fos = new FileOutputStream(");      StreamResult result = new StreamResult(fos);      // 把dom树转换为      tf.transform(ds, result);      fos.close();      System.out.println("-=========写入完成!==========");    } catch (ParserConfigurationException e) {      e.printStackTrace();    } catch (SAXException e) {      e.printStackTrace();    } catch (IOException e) {      e.printStackTrace();    } catch (TransformerConfigurationException e) {      e.printStackTrace();    } catch (TransformerException e) {      e.printStackTrace();    }  }

 

三、修改节点

// 修改节点将苹果修改为Apple  public static void modify() {    try {      // 创建DocumentBuilderFactory      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();      // 创建DocumentBuilder      DocumentBuilder db = dbf.newDocumentBuilder();      // 创建Document      Document doc = db.parse(");      NodeList brandList = doc.getElementsByTagName("Brand");      for (int i = 0; i < brandList.getLength(); i++) {        Element brand = (Element) brandList.item(i);        String brandName = brand.getAttribute("name");        // 查找        if (brandName.equals("苹果")) {          // 修改属性          brand.setAttribute("name", "Apple");        }      }      // 写入      TransformerFactory trf = TransformerFactory.newInstance();      Transformer tf = trf.newTransformer();      DOMSource ds = new DOMSource(doc);      // 设置流      FileOutputStream fos = new FileOutputStream(");      StreamResult result = new StreamResult(fos);      // 设置编码类型      tf.setOutputProperty(OutputKeys.ENCODING, "utf-8");      // 写入文件      tf.transform(ds, result);      fos.close();      System.out.println("-=========修改完成!==========");    } catch (ParserConfigurationException e) {      e.printStackTrace();    } catch (SAXException e) {      e.printStackTrace();    } catch (IOException e) {      e.printStackTrace();    } catch (TransformerConfigurationException e) {      e.printStackTrace();    } catch (TransformerException e) {      e.printStackTrace();    }  }

 

四、删除节点

// 删除Brand name是华为的子节点  public static void delete(){    try {    //创建DocumentBuilerFactory      DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();    //DocumentBuilder      DocumentBuilder db=dbf.newDocumentBuilder();    //创建Document      Document doc=db.parse(");    //创建Brand节点集合      NodeList brandList=doc.getElementsByTagName("Brand");      //遍历      for (int i = 0; i < brandList.getLength(); i++) {        Element brandElement=(Element) brandList.item(i);        String name=brandElement.getAttribute("name");        if(name.equals("华为")){          //获取父节点,使用父节点删除这个节点          brandElement.getParentNode().removeChild(brandElement);        }      }      //写入      TransformerFactory trf=TransformerFactory.newInstance();      Transformer tf=trf.newTransformer();      //数据源      DOMSource ds=new DOMSource(doc);      //设置流      FileOutputStream fos=new FileOutputStream(");      StreamResult result=new StreamResult(fos);      //设置编码格式      tf.setOutputProperty(OutputKeys.ENCODING,"utf-8");      //写入文件      tf.transform(ds, result);      fos.close();          } catch (ParserConfigurationException e) {      e.printStackTrace();    } catch (SAXException e) {      e.printStackTrace();    } catch (IOException e) {      e.printStackTrace();    } catch (TransformerConfigurationException e) {      e.printStackTrace();    } catch (TransformerException e) {      e.printStackTrace();    }  }

 五、更新RSS

package com.pb.biz;import java.io.BufferedReader;import java.io.FileWriter;import java.io.InputStreamReader;import java.net.URL;import java.net.URLConnection;public class DownloadRSSBiz {  /**   * 下载RSS   * @param url   */  public void downloadRSS(String url){    try {      // 发帖机原理,模拟浏览器      // final String SERVER_URL =      // "http://10.0.0.131/mobile/special/001144R8/gedihangqing."; //      // 定义需要获取的内容来源地址      URL uri = new URL(url);      URLConnection con = uri.openConnection();      con.setDoOutput(true);      //设置请求参数      con.setRequestProperty("Pragma:", "no-cache");      con.setRequestProperty("Cache-Control", "no-cache");      con.setRequestProperty("Content-Type", "text/);      //取返回值      BufferedReader br = new BufferedReader(new InputStreamReader(con          .getInputStream(), "GBK"));      StringBuilder sBuilder = new StringBuilder();      String line = "";      for (line = br.readLine(); line != null; line = br.readLine()) {        sBuilder.append(line);      }      //存入文件      FileWriter writer = new FileWriter("src/网易手机各地行情.false);      writer.write(sBuilder.toString());      //关闭流      writer.close();      br.close();    } catch (Exception e) {      String str = e.getMessage();      System.out.println(str);    }  }  }