DOM解析XML文件
DOM一些介绍请看前一篇文章http://t.csdn.cn/aVY2E
DOM解析XML文件步骤
1.创建解析器工厂对象
2.解析器工厂对象创建解析器对象
3.解析器对象指定XML文件创建Document对象
4.以Document对象为起点操作DOM树
对XML文件进行添加元素,删除元素,修改元素,查找元素,保存修改后的XML文件这五项操作,
涉及Document接口,DocumentBuilderFactory类,DocumentBuilder类,Element接口,Node接口,NodeList接口,TransformerFactory类,Transformer类,DOMSource类,StreamResult类。通过对象调用涉及以上接口,类的方法来执行对XML文件的操作
保存XML文件步骤:
1.获得TransformerFactory对象
2.创建Transformer对象
3.创建DOMSource对象 包含XML信息
4.设置输出属性 编码格式
5.创建StreamResult对象 包含保存文件的信息
6.将XML保存到指定文件中
实例:
package demo01;
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;
public class ParseXMLDemo {
private Document document = null;
//定义一个方法,将XML文件转换为Document对象
public void getDocument(String url) {
//获取解析器工厂引用
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
//通过解析器工厂引用调用方法获取解析器的引用
DocumentBuilder builder = factory.newDocumentBuilder();
//通过解析器引用调用方法将指定的XML文件转换为Document类对象
document = builder.parse(url);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// 获取手机品牌和属性
public void showInfo() {
//从document对象出发,调用方法获取节点,根据标签的名称来获取节点,获取的可能有多个节点,所以得到的是一个节点集合
NodeList brands = document.getElementsByTagName("Brand");
//遍历节点集合,取出里面的元素,getLength():获取节点集合中的元素个数
for (int i = 0; i < brands.getLength(); i++) {
//item():将元素从集合中取出来,取出来的是父类型Node
Node node = brands.item(i);
//将父类型向下转型为真正的类型,Brand是一个标签节点,所以向下转型为Element
Element eleBrand = (Element) node;
//得到标签节点后,调用方法获取指定属性的属性值
System.out.println(eleBrand.getAttribute("name"));
//获取Brand标签的子节点,可能有多个不同类型的子节点,将获取的子节点存储在节点集合中 getChildNodes():获取子节点的方法
NodeList types = eleBrand.getChildNodes();
//遍历子节点的集合
for (int j = 0; j < types.getLength(); j++) {
//从集合中取出子节点
Node typeNode = types.item(j);
//从集合中取出来的子节点类型可能是文本节点,也可能是标签节点,所以在进行类型转换之前,要进行类型判断, getNodeType() 获取节点的类型值,是一个short值,Node里面给不同类型的节点赋予了一个静态常量值,其中Element类型节点的值为1
if (typeNode.getNodeType() == Node.ELEMENT_NODE) {
//将父节点向下转型为子节点类型
Element eleType = (Element) typeNode;
//通过子节点调用方法获取执行属性的属性值
System.out.println("\t"+eleType.getAttribute("name"));
}
}
}
}
// 保存XML文件:将Java内存中的document对象存储到外部xml文件中,需要借助转换器对象实现此功能
public void savaXML(String path) {
//创建转换器工厂对象
TransformerFactory factory = TransformerFactory.newInstance();
//设置首行缩进4个字符
factory.setAttribute("indent-number", "4");
try {
//通过转换器工厂对象创建转换器对象
Transformer transformer = factory.newTransformer();
//设置存储的格式
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
//创建transform()方法需要的两个参数对象
StreamResult result = new StreamResult(new OutputStreamWriter(
new FileOutputStream(path), "UTF-8"));
DOMSource source = new DOMSource(document);
/*通过转换器对象调用方法将Java内存中的document对象存储到外部XML文件中,
* transform(Source source,Result result)需要两个参数,
* Source表示源头,也就是Java内存中的document对象,而Source是一个接口,不能直接创建对象,可以使用其实现类DOMSource
* Result表示结果,也就是Java内存中的document对象要存储的位置,而Result是一个接口,不能直接创建对象,可以使用其实现类StreamResult
*
*/
transformer.transform(source, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
// 添加元素到XML文件中
public void add() {
//通过document对象调用方法创建一个元素节点
Element element = document.createElement("Brand");
//通过创建的元素节点调用方法给元素节点设置属性及属性值
element.setAttribute("name", "三星");
通过document对象调用方法创建一个元素节点
Element ele1 = document.createElement("Type");
//通过创建的元素节点调用方法给元素节点设置属性及属性值
ele1.setAttribute("name", "Note3");
//将创建好的两个节点建立关系
element.appendChild(ele1);
//获取xml文件中的第一个PhoneInfo元素节点,然后将创建好的brand标签作为子节点追加到获取的第一个PhoneInfo元素节点中
document.getElementsByTagName("PhoneInfo").item(0).appendChild(element);
//元素添加完毕之后,需要将java内存中的document对象存储到xml文件中
this.savaXML("收藏信息.xml");
}
// 修改:修改xml文件中的内容
public void update() {
//通过document对象获取你想要修改的元素,将获取的元素存储在节点集合中
NodeList brands = document.getElementsByTagName("Brand");
//遍历节点结合,修改节点(给节点添加了一个id属性)
for (int i = 0; i < brands.getLength(); i++) {
//取出节点集合中的元素
Node brand = brands.item(i);
//将节点元素转换成其真正的类型
Element eleBrand = (Element) brand;
//给元素节点添加了一个新的属性id
eleBrand.setAttribute("id", i + "");
}
this.savaXML("收藏信息.xml");
}
// 删除:删除xml文件中的某一些标签
public void delete() {
//通过Document对象获取你想要删除的元素节点,将元素节点存储在节点集合中
NodeList brands = document.getElementsByTagName("Brand");
//遍历结合
for (int i = 0; i < brands.getLength(); i++) {
//取出节点集合中的元素
Node brand = brands.item(i);
//将节点转换成真正的类型
Element eleBrand = (Element) brand;
//从遍历出的元素节点找出你要删除的元素节点,通过元素节点的属性值值来找
if (eleBrand.getAttribute("name").equals("华为")) {
//删除元素,不能自己删除自己,需要通过其父元素来删除 getParentNode():获取父节点 removeChild(元素节点名):删除子节点
eleBrand.getParentNode().removeChild(eleBrand);
}
}
this.savaXML("收藏信息.xml");
}
//测试
public static void main(String[] args) {
//创建ParseXMLDemo类对象
ParseXMLDemo pd = new ParseXMLDemo();
pd.getDocument("收藏信息.xml");
// pd.showInfo();
pd.add();
pd.showInfo();
// pd.update();
// pd.delete();
// pd.showInfo();
}
}
DOM4j解析XML文件
DOM4j简介
DOM4J是 dom4j.org 出品的一个开源 XML 解析包。DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP
DOM4J 使用起来非常简单。只要你了解基本的 XML-DOM 模型,就能使用
Dom:把整个文档作为一个对象
DOM4J 最大的特色是使用大量的接口。它的主要接口都在org.dom4j里面定义
Document:定义XML文档
Element:定义XML元素
Text:定义XML文本节点
Attribute:定义了XML 的属性
JDK中是没有DOM4j解析XML文件所需的类和接口,需要从网页下载,网址如下:dom4jhttps://dom4j.github.io/#parsing下载完成是需要配置入你所写文件中;
以MyEclipse为例,配置步骤如下:
1.在工程右击点开Build Path,点击Configure Build Path...
2.点击Add Library...
3.点击Add Library...后,出现这个界面,点击User Library,再点击Next
4.点击User Libraries...
5.点击New...,新建文件,给文件取名,点击OK
6.点击新建文件,再点击Add JARs...,寻找到从dom4j网站下载的文件,点击OK
7.出现文件前像奶杯的图标,表示文件已配置完成,一路点OK就行了。至此,就可以使用DOM4j所需要的类和接口了
完成之后工程界面图案:
实例:
package cn.bdqn.demo02;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4j {
public static Document doc;
//定义方法:将xml文件转换为document类对象
public static void loadDocument(){
//创建SAXReader类对象,调用方法read()方法将xml文件转换为document类对象
SAXReader saxReader = new SAXReader();
try {
doc = saxReader.read(new File("收藏信息.xml"));
} catch (DocumentException e) {
e.printStackTrace();
}
}
//修改:修改xml文件中的内容
public static void updatePhoneInfo(){
//获取XML的根节点
Element root = doc.getRootElement();
int id =0;
for (Iterator itBrand = root.elementIterator();itBrand.hasNext();) {
Element brand =(Element) itBrand.next();
id++;
brand.addAttribute("id", id+"");
}
saveXML("收藏信息.xml");
}
//删除:删除xml文件中的某一些标签
public static void deleteItem(){
//获取XML的根节点
Element root = doc.getRootElement();
for(Iterator itBrand = root.elementIterator();itBrand.hasNext();){
Element brand =(Element) itBrand.next();
if(brand.attributeValue("name").equals("华为")){
//删除元素需要通过其父元素来进行删除
brand.getParent().remove(brand);
}
}
saveXML("收藏信息.xml");
}
//定义方法:显示xml文件中的手机品牌和类型
public static void showPhoneInfo(){
//获取xml的根节点
Element root = doc.getRootElement();
//通过根节点调用elementIterator()方法获取根节点的所有子元素Brand,将获取的brand标签存储在迭代器,然后遍历所有的Brand标签
for(Iterator itBrand = root.elementIterator();itBrand.hasNext();){
Element brand = (Element) itBrand.next();
//attributeValue(属性名):根据属性名输出标签的属性值
System.out.println("品牌:"+brand.attributeValue("name"));
//使用brand节点调用elementIterator()方法获取brand标签的子标签type,然后遍历Type标签
for (Iterator itType = brand.elementIterator();itType.hasNext();) {
Element type = (Element) itType.next();
//attributeValue(属性名):根据属性名输出标签的属性值
System.out.println("\t型号:"+type.attributeValue("name"));
}
}
}
//保存XML文件
public static void saveXML(String path){
try {
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK");// 指定XML编码
XMLWriter writer= new XMLWriter(new FileWriter(path), format);
writer.write(doc);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//添加元素到XML文件中
public static void addNewPhoneInfo(){
//获取xml的根节点
Element root = doc.getRootElement();
//创建Brand标签
Element el = root.addElement("Brand");
//给Brand标签设置属性
el.addAttribute("name", "三星");
//创建Type标签
Element typeEI = el.addElement("Type");
//给Type标签设置属性
typeEI.addAttribute("name", "Note4");
saveXML("收藏信息.xml");
}
public static void main(String[] args){
loadDocument();
// showPhoneInfo();
// saveXML("收藏.xml");
// addNewPhoneInfo();
// updatePhoneInfo();
deleteItem();
showPhoneInfo();
}
}