DOM实现对XML的读写(1/4——XML读写篇)
今天花了老半天终于是搞懂了用DOM来读写XML
对于读取XML,利用迭代写了一个方法,实现了给一个根节点就能读取其下所有子节点,子节点的子节点的属性及属性值,还有节点间文本
package DOMTest; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; 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.TransformerFactoryConfigurationError; 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.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; import org.xml.sax.SAXException; public class DOMTest { /** * DOM实现XML的读取 * 读取分为标签,标签属性 * 标签间内容 */ public void readXML() { //1.调用静态方法实例化一个DocumentBuilderFactory DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); //2.随之创建一个DoucmentBuilder对象 try { DocumentBuilder db=dbf.newDocumentBuilder(); //3.使用DocumentBuilder对象来进行解析文件,返回一个Document对象 Document dm=db.parse("res/book.xml"); //4.对Document对象进行层层解析 //最外层,根节点,每一个节点自己的属性和名称 NodeList genList=dm.getChildNodes(); getAttr(genList); } catch (ParserConfigurationException e) { e.printStackTrace(); }catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //有这个方法对于任何一个xml都可以读取出来,但是应该只适用于小文件 public void getAttr(NodeList nl) { //传入的是一个节点列需要遍历处理,获取属性和属性值 if(nl.getLength()==0){ System.out.println("该节点没有子节点"); }else{ for(int i=0;i<nl.getLength();i++){ int num=0; Node node=nl.item(i); //取到单个节点,且过滤掉空白文档 if(node.getNodeType()!=Text.TEXT_NODE){ System.out.print("节点:\t"+node.getNodeName()); NamedNodeMap nnm=node.getAttributes(); num=nnm.getLength(); if(num==0){ System.out.print("(无属性值)"); }else{ for(int j=0;j<num;j++){ Node item=nnm.item(j); System.out.print("\t属性名称:"+item.getNodeName()+"--\t属性值:"+item.getNodeValue()); } } NodeList itList=node.getChildNodes(); getAttr(itList); }else{ System.out.print("\t\t"+node.getTextContent()); } } } } /** * DOM实现XML的写入 * */ public void writerXML(){ //和读取基本是相似的 //先创建dbf DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); //创建db try { DocumentBuilder db=dbf.newDocumentBuilder(); //读取时是用parser读取Document,现在是用创建Document Document doc=db.newDocument(); //先放在这,建XML树 Element e0=doc.createElement("bookstore"); //加一本书 e0.setAttribute("info", "2016/7/20"); Element e1=doc.createElement("book"); e1.setAttribute("id", "1"); e1.setAttribute("info", "文学类"); Element e11=doc.createElement("name"); Text nameValue=doc.createTextNode("蛙"); Element e12=doc.createElement("author"); Text authorValue=doc.createTextNode("莫言"); //树顺序将文本添加到XML中去 doc.appendChild(e0); e0.appendChild(e1); e1.appendChild(e11); e11.appendChild(nameValue); e1.appendChild(e12); e12.appendChild(authorValue); Transformer t=TransformerFactory.newInstance().newTransformer(); //设置换行和首行缩进 t.setOutputProperty(OutputKeys.INDENT,"yes"); t.setOutputProperty(OutputKeys.METHOD, "xml"); //输出 t.transform(new DOMSource(doc), new StreamResult(new FileOutputStream(new File("book01.xml")))); } catch (ParserConfigurationException e) { e.printStackTrace(); }catch (TransformerConfigurationException | TransformerFactoryConfigurationError e) { e.printStackTrace(); }catch (FileNotFoundException | TransformerException e) { e.printStackTrace(); } } public static void main(String[] args) { DOMTest dm=new DOMTest(); dm.readXML(); dm.writerXML(); } }
下面是我的XML
<?XML version = "1.0" encoding="UTF-8"?> <bookstore info="2016/7/20"> <book id="1" lib="益智类"> <name>十万个为什么</name> <author>失名</author> <year>1995</year> <publisher>北京文化出版社</publisher> </book> <book id="2" lib="益智类"> <name>十万个不为什么</name> <author>不失名</author> <year>1995</year> <publisher>北京文化娱乐出版社</publisher> </book> <book id="3" lib="科学类"> <name>上帝在掷骰子吗?</name> <author>一个中国人</author> <year>1999</year> <publisher>北京科学出版社</publisher> </book> </bookstore>
对于读取结果

对于写入结果
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <bookstore info="2016/7/20"> <book id="1" info="文学类"> <name>蛙</name> <author>莫言</author> </book> </bookstore>
目前存在的疑问是:1.调整输出,或者如何将输出写入数据库,或者集合接收。
2.写进XML文件应该还可以封装为一个方法,简单调用什么的
如果我的文章给您带来不便,还请见谅,如果我的文章给您带来帮助,我很荣幸,如果大牛有高见(应该不会有大牛过来看这个。。),乐意接受!
2016/7/20 TheTinkerJ

浙公网安备 33010602011771号