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里面的信息的更多相关文章

  1. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  2. 使用dom解析器对xml文档内容进行增删查改

    直接添代码: XML文档名称(one.xml) <?xml version="1.0" encoding="UTF-8" standalone=" ...

  3. Java DOM解析器 - 修改XML文档

    这是我们需要修改的输入XML文件: 1 2 3 4 5 6 7 8 9 10 11 12 <?xml version="1.0" encoding="UTF-8&q ...

  4. 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"?> ...

  5. 解析XML文件之使用DOM解析器

    在前面的文章中.介绍了使用SAX解析器对XML文件进行解析.SAX解析器的长处就是占用内存小.这篇文章主要介绍使用DOM解析器对XML文件进行解析. DOM解析器的长处可能是理解起来比較的直观,当然, ...

  6. 通过pull解析器操作安卓的xml

    通过pull解析器操作安卓的xml 例子定义了一个javabean用于存放上面解析出来的xml内容, 这个javabean为Person,代码请见本页下面备注: =================== ...

  7. Java DOM解析器 - 解析XML文档

    使用DOM的步骤 以下是在使用DOM解析器解析文档使用的步骤. 导入XML相关的软件包. 创建DocumentBuilder 从文件或流创建一个文档 提取根元素 检查属性 检查子元素 导入XML相关的 ...

  8. dom解析器机制 web基本概念 tomcat

    0 作业[cn.itcast.xml.sax.Demo2]   1)在SAX解析器中,一定要知道每方法何时执行,及SAX解析器会传入的参数含义 1 理解dom解析器机制 1)dom解析和dom4j原理 ...

  9. JAVA与DOM解析器提高(DOM/SAX/JDOM/DOM4j/XPath) 学习笔记二

    要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载   sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无 ...

随机推荐

  1. 21、手把手教你Extjs5(二十一)模块Form的自定义的设计

    前面几节完成了模块Grid的自定义,模块Form自定义的过程和Grid的过程类似,但是要更复杂一些.先来设计一下要完成的总体目标. 1、可以有多个Form方案,对应于显示.新增.修改.审核.审批等功能 ...

  2. IOS9任务管理器特效的实现

    IOS9任务管理器特效的实现 IOS9中通过双击home键可以打开任务管理器,和以前版本不一样的地方时这这次使用的3D的特效,见下图: 那么如何在我们的APP中也制作出这样的特效呢?在GItHub上有 ...

  3. VMWare虚拟机启动报错物理内存不足

    尝试了三种修改 1.说是微软补丁KB2995388冲突-->>失败 2.修改win8.1高级环境性能更改设置-->>失败 3.修改config.ini文件-->>成 ...

  4. EF dbcontext上下文的处理

    ,那么我们整个项目里面上下文的实例会有很多个,我们又遇到了多次,当我们在编程的时候遇到多的时候,一般我们就要想想能不能解决多这个问题. (2)这里我要说的是EF上下文怎么管理呢?很简单啦,就是要保证线 ...

  5. 聊聊Node.js 独立日漏洞

    背景 Node.js 社区近期在美国独立日周末的狂欢之时爆出漏洞 https://medium.com/@iojs/important-security-upgrades-for-node-js-an ...

  6. Hibernate的一些事儿

    一.Hibernate的工作原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提 ...

  7. EclipseEE导入项目出现的那些问题

    1.显示.project文件丢失, 解决方法:在eclipse中删除和该项目相同的文件名,重新import即可 2.导入没有.classpath和.project文件的项目 解决方法:目前没遇到 3. ...

  8. c++ split()实现

    在c++中,没有java与python中定义的split()功能的函数,于是自己实现之. 情况1,适用范围,分隔符为字符.思路,记录分隔符的位置,判断需要截取的字符串的下标范围. vector< ...

  9. iOS 使用 github

    1. 创建 github 账号 登陆官网 https://github.com 进行创建. 2. 创建 github 仓库 3. 添加Pods依赖库所需文件 4. github 之 下载历史版本 5. ...

  10. 如何设置打开jsp页面速度加快?

    1.