========
理解熟悉:
// 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>