========
理解熟悉:
// StreamResult result=new StreamResult(new FileOutputStream(path));
// SteamResult:充当转换结果的持有者,可以为 XML、纯文本、HTML 或某些其他格式的标记。
// StreamResult(OutputStream outputStream);从字节流构造 StreamResult。
StreamResult result=new StreamResult(new OutputStreamWriter(new FileOutputStream(path), "gb2312"));
// 然后将被变换的Document对象封装到一个DOMSource对象中,DOMSource类在javax.xml.transform.dom包中。
DOMSource source=new DOMSource(document);
transformer.transform(source, result);
========
================================代码开始========================================
一。XMLDemo
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 XMLDemo {
private Document document = null;
public static void main(String[] args) {
XMLDemo xd=new XMLDemo();
xd.getDocument();
xd.showInfo();
// xd.add();
// xd.update();
// xd.savaXML("new.xml");
// xd.delete();
}
public void getDocument(){
try {
//创建解析器工厂实例
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//通过工厂获得解析器
DocumentBuilder db;
db = factory.newDocumentBuilder();
//解析器对象指定XML文件创建Document对象
document = db.parse("收藏信息.xml");
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//载入元素
public void showInfo(){
//以Document为起点操作DOM树,拿到brand节点集合
NodeList brands =document.getElementsByTagName("brand");
for(int i=0;i<brands.getLength();i++){
//获得集合里的各个元素(element)
Node node=(Node)brands.item(i);
//类型转换为(element)
Element eleBrand=(Element)node;
//取得元素里 属性名name的属性值
System.out.println(eleBrand.getAttribute("name"));
//拿到brand节点下子节点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 eleType=(Element)typeNode;
System.out.println(" "+eleType.getAttribute("typename"));
}
}
}
}
//保存新新XML文件
public void savaXML(String path){
/*
* DOM对象转化为XML文件
解析器通过在内存中建立和XML结构相对应的树状结构数据,使得应用程序可以方便地获得XML文件中的数据,
同时提供了使用内存中的树状结构数据建立一个XML文件的API,即使用解析器得到的Document对象建立一个新的XML文件。
但是需要注意的是,Android2.1中没有相应的类包,从2.2开始才加入了。
解析器的parse方法将整个被解析的XML文件封装成一个Document节点返回,
我们可以对Document节点进行修改,然后使用 Transformer对象将一个Document节点变换为一个XML文件。
* */
TransformerFactory factory=TransformerFactory.newInstance();
factory.setAttribute("indent-number", "4");
try {
Transformer transformer=factory.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
// StreamResult result=new StreamResult(new FileOutputStream(path));
// SteamResult:充当转换结果的持有者,可以为 XML、纯文本、HTML 或某些其他格式的标记。
// StreamResult(OutputStream outputStream);从字节流构造 StreamResult。
StreamResult result=new StreamResult(new OutputStreamWriter(new FileOutputStream(path), "gb2312"));
// 然后将被变换的Document对象封装到一个DOMSource对象中,DOMSource类在javax.xml.transform.dom包中。
DOMSource source=new DOMSource(document);
transformer.transform(source, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
//增加元素
public void add(){
Element element=document.createElement("Brand");
element.setAttribute("name", "三星");
Element ele1=document.createElement("Type");
ele1.setAttribute("typename", "Note3");
element.appendChild(ele1);
document.getElementsByTagName("PhoneInfo").item(0).appendChild(element);
this.savaXML("new.xml");
}
//删除元素
public void delete(){
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("苹果")){
eleBrand.getParentNode().removeChild(eleBrand);
}
}
// this.savaXML("new.xml");
}
//修改元素,为每一个Brand增加一个id 属性分别为 0 1 2 ;
public void update(){
NodeList brands=document.getElementsByTagName("Brand");
for(int i=0;i<brands.getLength();i++){
Node brand=brands.item(i);
Element eleBrand=(Element)brand;
eleBrand.setAttribute("id", i+"");
}
// this.savaXML("new.xml");
}
}
二、收藏信息.xml
<?xml version="1.0" encoding="GB2312"?>
<PhoneInfo>
<brand name="华为">
<type typename="U8650"/>
<type typename="HW123"/>
<type typename="HW321"/>
</brand>
<brand name="苹果">
<type typename="iphone4"/>
<type typename="iphone5"/>
<type typename="iphone6"/>
</brand>
</PhoneInfo>