一、DOM解析XML

xml文件

favorite.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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 getItemXML() {
try { // 1.得到DOM解析器的工厂
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 2.得到DOM工厂获得DOM解析器
DocumentBuilder db = dbf.newDocumentBuilder(); // 3.解析XML文档,得到一个Document即DOM树
Document doc = db.parse("xml/favorite.xml");
// 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();
} }

有文本内容的解析

网易手机各地行情.xml--一部分

<?xml version="1.0" encoding="GBK"?><?xml-stylesheet type="text/css" href="http://news.163.com/css/allrss.css"?>
<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("xml/网易手机各地行情.xml");
//获取节点
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();
} }

二、增加XML

// 增加新的节点 增加小米
public static void savePhone() { try {
// 1.创建DocumentBuilderFactory
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 2.创建DocumentBuilder
DocumentBuilder db = dbf.newDocumentBuilder();
// 3.创建Document
Document doc = db.parse("xml/favorite.xml");
// 创建新的节点
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); // 保存XML
TransformerFactory trf = TransformerFactory.newInstance();
Transformer tf = trf.newTransformer();
// 数据源
DOMSource ds = new DOMSource(doc);
// 设置编码类型
tf.setOutputProperty(OutputKeys.ENCODING, "utf-8");
// 设置流
FileOutputStream fos = new FileOutputStream("xml/favorite.xml");
StreamResult result = new StreamResult(fos);
// 把dom树转换为XML
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("xml/favorite.xml");
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");
}
} // 写入XML
TransformerFactory trf = TransformerFactory.newInstance();
Transformer tf = trf.newTransformer();
DOMSource ds = new DOMSource(doc);
// 设置流
FileOutputStream fos = new FileOutputStream("xml/favorite.xml");
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("xml/favorite.xml");
//创建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);
}
}
//写入XML
TransformerFactory trf=TransformerFactory.newInstance();
Transformer tf=trf.newTransformer();
//数据源
DOMSource ds=new DOMSource(doc);
//设置流
FileOutputStream fos=new FileOutputStream("xml/favorite.xml");
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.xml"; //
// 定义需要获取的内容来源地址 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/xml"); //取返回值
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/网易手机各地行情.xml", false);
writer.write(sBuilder.toString());
//关闭流
writer.close();
br.close(); } catch (Exception e) {
String str = e.getMessage();
System.out.println(str);
}
} }

Java从零开始学四十二(DOM解析XML)的更多相关文章

  1. Java从零开始学四十(反射简述一)

    一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...

  2. Java从零开始学四十五(Socket编程基础)

    一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...

  3. Java从零开始学四十四(多线程)

    一.进程与线程 1.1.进程 进程是应用程序的执行实例. 进程是程序的一次动态执行过程,它经历了从代码加载.执行到执行完毕的一个完整过程,这个过程也是进程本身从产生.发展到最终消亡的过程 特征: 动态 ...

  4. Java从零开始学三十二(正则表达式)

    一.为什么要有正则 正则表达式可以方便的对数据进行匹配,可以执行更加复杂的字符串验证.拆份.替换功能. 例如:现在要求判断一个字符串是否由数字组成,则可以有以下的两种做法: 不使用正则完成 使用正则完 ...

  5. Java从零开始学四十六(Junit)

    一.软件测试 软件开发: 项目调研--需求分析--软件设计--程序编码--软件测试--运行维护 软件测试:利用测试工具按照测试方案和流程对产品进行功能和性能测试,使用人工或者自动手段来运行或测试某个系 ...

  6. Java从零开始学四十三(DOM4j解析XML)

    一.创建XML // 建立XML public static void gernatorXML() { // 创建Document对象 Document doc = DocumentHelper.cr ...

  7. Java从零开始学四十一(反射简述二)

    一.实例化Class类对象 实例化Class类对象的方法有三种: 第一种:通过forName()方法 第二种:类.class 第三种:对象.getClass() 二.Class类的常用方法 No. 方 ...

  8. Java从零开始学四十七(注解简述)

    一.Java中注解Annotation 什么是注解:用来描述数据的数据(元数据). Java代码里的特殊标记.它为代码中添加用Java程序无法表达的额外信息提供一种形式化的方法,使用我们可以在未来的某 ...

  9. Java从零开始学三十九(对象序列化)

    一.序列化 将对象的状态存储到特定存储介质中的过程 对象序列化,就是把一个对象变为二进制的数据流的一种方法,通过对象序列化可以方便的实现对象的传输或存储.   序列化保存对象的“全景图”,构建对象的“ ...

随机推荐

  1. 高性能JavaScript-JS脚本加载与执行对性能的影响

    在web产品优化准则中,很重要的一条是针对js脚本的加载和执行方式的优化.本篇文章简单描述一下其中的优化准则. 1. 脚本加载优化 1.1 脚本位置对性能的影响 优化页面加载性能的原则之一是将scri ...

  2. EXCEL 数字+E+数字 自动识别为指数形式的解决办法

    1.今天从数据库导出excel表时,出现本来为"2E3"的单元格错误显示为"2.00E+03"的情况 2.而设置 单元格格式 为"文本"后, ...

  3. Windows平台下ActiveMQ 安装

    安装之前需要先确定机器上已经有JVM环境,如果没有则会在安装过程中提示 Unable to execute Java command.  系统找不到指定的文件 第一步:从官网下载ActiveMQ的安装 ...

  4. 【Spark】----Spark on Yarn

    最近从Hadoop 1.x 转到Hadoop 2.x 同时将一些java 程序转为Scala的程序将平台上的代码减少了很多,在实施的过程中,开到一些Spark相关的YARN的部署上都是基于之前的Had ...

  5. 重构第21天 合并继承 (Collapse Hierarchy)

    理解:本文中的”合并继承”是指如果子类的属性和方法也适合于基类,那么就可以移除子类,从而减少依赖关系. 详解:上一篇我们讲到“提取子类”重构是指当基类中的一个责任不被所有的子类所需要时,将这些责任提取 ...

  6. 循序渐进开发WinForm项目(1) --数据库设计和项目框架的生成

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  7. C# winform调用浏览器打开页面方法分享,希望对大家有帮助

    在很多客户端程序中我们都需要调用浏览器打开网页,这里分享一个可以在我winform程序调用浏览器的方法,测试通过了. 声明:这个方法是上万个用户测试通过的,不是我没有测试通过就拿出来分享,那个是自己搬 ...

  8. 使用Dhcpstarv解决DHCP服务器冲突问题

    场景: 内网环境需要开启多个DHCP服务器,分别给不同的设备进行PXE安装. 存在的问题: 多个DHCP的情况下,设备在启动时随机从一个DHCP服务器获取IP(哪个DHCP服务器先响应就从哪个获取)并 ...

  9. USE “schema_name” in PostgreSQL

    http://timmurphy.org/tag/mysql/ http://timmurphy.org/2009/11/17/use-schema_name-in-postgresql/ ===== ...

  10. Metronic 使用到的开源插件汇总

    Metronic 是一套完整的 UI 模板,但不仅仅是模板,更应该说是一个 UI 框架.它除了提供了大量网页模板,也提供了非常多的 UI 组件,并且应用了众多 jQuery 插件.通过这些资源的整合, ...