dom解析方式对xml文档进行操作

来源:互联网 发布:cntv中国网络电视 编辑:程序博客网 时间:2024/05/17 05:15



<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8" standalone="no"?><书架>  <书>    <书名 name="xxx">java就业培训教程</书名>    <作者>张孝祥</作者>    <售价>36.2元</售价>    </书>      <书>    <书名>javascript就业培训教程</书名>    <作者>张孝祥</作者>    <售价>36.2元</售价>  </书>   </书架></span>



<span style="font-size:14px;">package com.rj.xml;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.junit.Test;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.xml.sax.SAXException;//使用dom方式对xml文档进行crudpublic class Demo01 {//读取xml文档中:  <书名>javascript就业培训教程</书名> 节点的值@Testpublic void read1() throws Exception{//1.创建工厂DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//2.得到dom解析器DocumentBuilder builder = factory.newDocumentBuilder();//解析xml文档,得到代表文档的document对象Document document = builder.parse("src/book.xml"); NodeList nodeList = document.getElementsByTagName("书名");//通过书名,查找所有书名的节点,即元素Node node = nodeList.item(1); //返回集合中的第 index 个项。String content = node.getTextContent();//返回节点中内容System.out.println(content); }/* * dom解析下,xml文档的每一个组成部分都会用一个对象表示,例如标签用Element,属性用Attr, * 但不管什么对象,都是Node的子类,所以在开发中可以把获取到的任意结点都当作Node对待. * *///得到xml中的所有标签@Testpublic void read2() throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse("src/book.xml"); //得到根节点NodeList  nodeList = document.getElementsByTagName("书架");Node root = nodeList.item(0);//或者直接 document.getElementsByTagName("书架").item(0);list(root);//递归过去所有节点}private void list(Node node) {if(node instanceof Element){System.out.println(node.getNodeName());}NodeList list = node.getChildNodes();//获取此结点下一层的所有结点,包括空格//System.out.println(list.getLength());for(int i=0;i<list.getLength();i++){Node child = list.item(i);list(child);}}//得到xml中文档属性的值: <书名 name="xxx">java就业培训教程</书名>@Testpublic void read3() throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse("src/book.xml");  /*Node node = document.getElementsByTagName("书名").item(0);NamedNodeMap namedNodeMap = node.getAttributes(); System.out.println(namedNodeMap.getNamedItem("name").getTextContent());当NamedNodeMap有多个的时候遍历比较麻烦,因此从他的子类Element这个类中找方法直接获取值*/Element bookname =   (Element) document.getElementsByTagName("书名").item(0); String value = bookname.getAttribute("name"); System.out.println(value);}//向xml中添加节点:第一本书中添加 <售价>50.0元</售价>@Testpublic void add01() throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse("src/book.xml");/* * 插入这个数据,先获取他的上一层的节点,利用他的节点,插入 * 创建节点时候,先创建再填充内容 * *///创建节点Element price = document.createElement("售价");price.setTextContent("50.0元");//把创建的节点挂到第一本书上Element book = (Element) document.getElementsByTagName("书").item(0);book.appendChild(price);/* * 更新xml文档 * javax.xml.transform包中的Tranformer类用于把代表XML文件的Document对象转换为某种格式后进行输出 * 例如:把xml文件应用样式表后转成一个html文档,利用这个对象,当然也可以把Document对象由重新写入一个XML文件中。 *  * Tranformer类通过transform方法完成转化操作,该方法接收一个源和一个目的地. * 我们可以通过: *   javax.xml.transform.dom.DOMSource类来关联要转换的document对象 *   用javax.xml.transform.stream.StreamResult对象来表示数据的目的地 *    *   Tranformer对象通过TransformFactory获得 *  * *//* * Transformer获取,用工厂类TransformerFactory中的静态方法-- * static TransformerFactory newInstance()            获取 TransformerFactory 的新实例。                     TransformerFactory中的方法:得到Transformer对象          abstract  Transformer newTransformer()           创建执行从 Source 到 Result 的复制的新 Transformer。            * Transformer抽象类里面有这样一个方法 * abstract  void transform(Source xmlSource, Result outputTarget)            *将 XML Source 转换为 Result。  * * 怎么通过Source的对象获取document对象-->Source的接口实现类DOMSource的构造方法 * DOMSource(Node n)               创建带有 DOM 节点的新输入源。 *  * Result的接口实现类StreamResult中的构造方法: * StreamResult(OutputStream outputStream)                    从字节流构造 StreamResult。 * *///更新后内存写回到xml文档中TransformerFactory transformerFactory = TransformerFactory.newInstance();Transformer transformer = transformerFactory.newTransformer();transformer.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml"))) ;}//在指定位置插入元素 <售价>36.2元</售价>节点之前@Testpublic void add02() throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse("src/book.xml"); //创建节点Element price = document.createElement("售价");price.setTextContent("59.9元");//得到参考节点Element refNode = (Element) document.getElementsByTagName("售价").item(0);//得到要挂崽的节点,即参考节点的上一层的节点Element book = (Element) document.getElementsByTagName("书").item(0);//往book的指定位置插崽,即插入参考节点book.insertBefore(price,refNode);//更新xmlTransformerFactory transformerFactory = TransformerFactory.newInstance();Transformer transformer = transformerFactory.newTransformer();transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));} //向xml文档中添加属性: <书名>java就业培训教程</书名>--> name="xxx"@Testpublic void addAttr() throws Exception{ DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder(); Document document = builder.parse("src/book.xml");  Element bookname = (Element) document.getElementsByTagName("书名").item(0); bookname.setAttribute("name", "xxx");  TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));} //删除第一个书名节点的售价:<售价>36.2元</售价>@Testpublic void delete1() throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse("src/book.xml");//得到要删除的节点Element e = (Element) document.getElementsByTagName("售价").item(0);//得到要删除节点的爸爸 Element book = (Element) document.getElementsByTagName("书").item(0); //爸爸想删除 book.removeChild(e);  //更新结果集 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));}           //删除  <售价>36.2元</售价>的父亲节点@Testpublic void delete2() throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse("src/book.xml");//得到要删除的节点//e.getParentNode()-->获取此节点的父亲节点Element e = (Element) document.getElementsByTagName("售价").item(0);e.getParentNode().getParentNode().removeChild(e.getParentNode());//删除所有节点//记住根节点的爸爸是document //e.getParentNode().getParentNode().getParentNode().removeChild(e.getParentNode().getParentNode());   //更新结果集 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));}//跟新售价 <售价>36.2元</售价>-->100元@Testpublic void update() throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse("src/book.xml");Element e = (Element) document.getElementsByTagName("售价").item(0);e.setTextContent("100元"); //更新结果集 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));} }  </span>


0 0
原创粉丝点击