使用Dom解析器,操作XML里面的信息
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
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.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
*
* 使用Dom解析器,操作XML里面的信息
*
* @author Rick
*
* 2016-12-10下午2:32:15
*/
public class OopParseXMLDemo {
private Document document;
// 获得DOM树,获得Document对象
public void getDom() {
// 创建解析器工厂对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 解析器工厂对象创建解析器对象
DocumentBuilder builder;
try {
builder = factory.newDocumentBuilder();
// 解析器对象指定XML文件创建Document对象
document = builder.parse("收藏信息.xml");
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// 解析 收藏信息.xml,获得手机品牌和型号
public void showInfo() {
// 以Document对象为起点操作DOM数
NodeList brands = document.getElementsByTagName("Brand");
// 遍历NodeList,取出各节点
for (int i = 0; i < brands.getLength(); i++) {
// 每一个Brand节点
Node node = brands.item(i);
Element eleBrand = (Element) node;
String brandName = eleBrand.getAttribute("name");
System.out.println(brandName);
// 继续找node下面的节点,就是<type>
NodeList types = eleBrand.getChildNodes();
for (int j = 0; j < types.getLength(); j++) {
Node typeNode = types.item(j);
// 判断节点是否为元素
if (typeNode.getNodeType() == Node.ELEMENT_NODE) {
Element typeEle = (Element) typeNode;
System.out.println("\t" + typeEle.getAttribute("name"));
}
}
}
}
// 保存XML文件
public void saveXML(String path) {
// 获得转换器
TransformerFactory factory = TransformerFactory.newInstance();
// ---1.--->把转换器设置一下缩进值通过setAttribute
factory.setAttribute("indent-number", 4);
try {
Transformer transformer = factory.newTransformer();
// 指定特定的转换格式
transformer.setOutputProperty(OutputKeys.ENCODING, "GB2312");
// ---2.---> 增加开启缩进转换格式
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
// 源
DOMSource source = new DOMSource(document);
// 目标
/*
* StreamResult result = new StreamResult(new
* FileOutputStream(path));
*/
// ---3.--->最后以流的形式OutputStreamWriter输出
StreamResult result = new StreamResult(new OutputStreamWriter(
new FileOutputStream(path), "gb2312"));
// 开始转换
transformer.transform(source, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
// 为xml文件添加元素
public void addEle() {
// (1)创建Brand元素
Element brand = document.createElement("Brand");
// (2)设置Brand元素的name="三星"
brand.setAttribute("name", "三星");
// (3)创建Type元素
Element type = document.createElement("Type");
// (4)设置Type元素name="Node2"
type.setAttribute("name", "Node2");
// (5)Type加到Brand里面去(添加一个孩子)
brand.appendChild(type);
// (6)再把Brand加到<PhoneInfo>里面来
document.getElementsByTagName("PhoneInfo").item(0).appendChild(brand);
saveXML("收藏信息.xml");
}
// 修改元素:为每个<Brand>添加一个id属性,取值分别为0 1 2
public void updateEle() {
// 获取到每个Brand元素
NodeList brands = document.getElementsByTagName("Brand");
for (int i = 0; i < brands.getLength(); i++) {
Node brand = brands.item(i);
Element brandEle = (Element) brand;
// 修改每一个Brand元素的属性id
brandEle.setAttribute("id", i + "");
}
saveXML("收藏信息.xml");
}
// 删除元素:删除手机品牌为“华为”的相关元素
public void deleteEle() {
// 遍历所有的Brand元素,找到Brand的name=“华为”元素
NodeList brands = document.getElementsByTagName("Brand");
for (int i = 0; i < brands.getLength(); i++) {
Node brand = brands.item(i);
Element brandEle = (Element) brand;
// 找到Brand的name=“华为”元素,将其删除
if (brandEle.getAttribute("name").equals("华为")) {
brandEle.getParentNode().removeChild(brandEle);
}
}
saveXML("收藏信息.xml");
}
public static void main(String[] args) {
OopParseXMLDemo pd = new OopParseXMLDemo();
// pd.showInfo();
pd.getDom();
// pd.saveXML("新收藏信息.xml");
// pd.addEle();
// pd.updateEle();
pd.deleteEle();
}
}
使用Dom解析器,操作XML里面的信息的更多相关文章
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...
- 使用dom解析器对xml文档内容进行增删查改
直接添代码: XML文档名称(one.xml) <?xml version="1.0" encoding="UTF-8" standalone=" ...
- Java DOM解析器 - 修改XML文档
这是我们需要修改的输入XML文件: 1 2 3 4 5 6 7 8 9 10 11 12 <?xml version="1.0" encoding="UTF-8&q ...
- Java DOM解析器 - 查询XML文档
这是需要我们查询的输入XML文件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <?xml version="1.0"?> ...
- 解析XML文件之使用DOM解析器
在前面的文章中.介绍了使用SAX解析器对XML文件进行解析.SAX解析器的长处就是占用内存小.这篇文章主要介绍使用DOM解析器对XML文件进行解析. DOM解析器的长处可能是理解起来比較的直观,当然, ...
- 通过pull解析器操作安卓的xml
通过pull解析器操作安卓的xml 例子定义了一个javabean用于存放上面解析出来的xml内容, 这个javabean为Person,代码请见本页下面备注: =================== ...
- Java DOM解析器 - 解析XML文档
使用DOM的步骤 以下是在使用DOM解析器解析文档使用的步骤. 导入XML相关的软件包. 创建DocumentBuilder 从文件或流创建一个文档 提取根元素 检查属性 检查子元素 导入XML相关的 ...
- dom解析器机制 web基本概念 tomcat
0 作业[cn.itcast.xml.sax.Demo2] 1)在SAX解析器中,一定要知道每方法何时执行,及SAX解析器会传入的参数含义 1 理解dom解析器机制 1)dom解析和dom4j原理 ...
- JAVA与DOM解析器提高(DOM/SAX/JDOM/DOM4j/XPath) 学习笔记二
要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载 sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无 ...
随机推荐
- Go的pprof使用
go中有pprof包来做代码的性能监控,在两个地方有包: net/http/pprof runtime/pprof 其实net/http/pprof中只是使用runtime/pprof包来进行封装了一 ...
- iOS 改变导航栏高度
需求: appdelegate里 rootviewcontroller 是tabbarcontroller,tabbarcontroller里有4个navigationcontroller,改变每个n ...
- 菊花加载第三方--MBprogressHUD 分类: ios技术 2015-02-05 19:21 120人阅读 评论(0) 收藏
上次说到了网络请求AFN,那么我们在网络请求的时候,等待期间,为了让用户不认为是卡死或程序出错,一般都会放一个菊花加载,系统有一个菊花加载类叫UIProgressHUD.但是我今天要说的是一个替代它的 ...
- 通过div模拟table
参考: https://css-tricks.com/complete-guide-table-element/ 不要使用内联样式,但只是为了了解这里是如何去: <section style=& ...
- Heka GeoIpDecoder 配置
Prepare: 安装geoip-api-c,确保/usr/include/GeoIP.h存在: 源码编译安装Heka (容易出现问题): 下载GeoLiteCity.dat数据库. 配置文件举例: ...
- php-fpm 相关
ps aux | grep -c php-fpm 查看php-fpm进程数:ps aux | grep -c php-fpm 查看运行内存/usr/bin/php -i|grep mem 重启php ...
- nginx 重启
/etc/init.d/nginx -s reload /etc/init.d/nginx reload
- Webx MVC分析(转)
Webx框架:http://openwebx.org/ petstore:webx3/webx-sample/petstore/tags/3.0/petstore 编译之后:mvn jetty:run ...
- 读【10问PHP程序员】 有感
http://bbs.phpchina.com/thread-174331-1-1.html 看到前人的文章,总结自己的学习心得,颇有感悟,下面是自己的总结,平时就拿出来多问问自己.1.上了十几年的学 ...
- 定制自己的Unity脚本模板
有时候想给脚本添加符合自己编程习惯的内容,或是一些个性化信息.而作为一个多多少少有点强迫症的人,这种东西要加就得每个脚本都加上,不然看着多不爽! 于是就得每添加一个脚本就去修改一下,很麻烦. 但是,在 ...