Java中有多种方式操作XML文件,目前讲一讲以SUN公司提供的DocumentBuilderFactory工厂类对象操作XML。
使用XML基本操作就是需要CRUD(增删改查),那么首先通过一个查询展示方法来说明JAXP的使用。
1 public static void run1() throws Exception{ 2 //获取解析器工厂类对象(DocumentBuilderFactory不能直接new,需要调用newInstance()方法创建实例对象) 3 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 4 //获取解析器对象(需要有异常捕获 throws Exception) 5 DocumentBuilder builder = factory.newDocumentBuilder(); 6 //获取XML文档路径,返回document对象(Document有三个包,一定要选org.w3c的,否则报错) 7 Document document = builder.parse("src/Demo.xml"); 8 //获取元素对象集合,返回NodeList对象 9 NodeList nodeList = document.getElementsByTagName("name"); 10 //遍历获得指定节点下的数据NodeList有两个方法,一个getLength()获得当前集合下的元素个数,一个获取指定元素item 11 for (int i = 0; i < nodeList.getLength(); i++) { 12 Node node = nodeList.item(i); 13 //得到元素下的内容/文本使用getTextContent() 14 System.out.println(node.getTextContent()); 15 } 16 }
如果想要插入一个节点元素,使用下列代码(需要上面代码获取到的document 对象;并且,插入的节点元素是插入到document对象中,并没有直接写入xml文件,如果要写入文件还需要回写类支持,稍后会说明)
1 //通过document对象创建一个元素节点lala 2 org.w3c.dom.Element element = document.createElement("lala"); 3 //设置元素节点的内容, 4 ele.setTextContent("中间是内容"); 5 //把创建的节点加入文档 6 document.appendChild(ele);
如果想要删除某一个元素节点,使用下列代码:
1 //---------------------删除---------------- 2 //获得节点的集合 3 NodeList nodelist = document.getElementsByTagName("add"); 4 //选取目标节点 5 Node node = nodelist.item(0); 6 7 //获取要删除节点的父节点(必须为父节点)!!!!!! 8 Node parNode = node.getParentNode(); 9 //通过父节点removeChild删除指定的节点 10 parNode.removeChild(node);
知道上述增删查方法了以后,更改某个节点内容相信就更容易了,无非是获得指定的节点,通过setTextContent来更改节点中的文本内容。而对于已经更改了内容的xml对象还是存在内存中,并没有真正体现在文件中,那么怎么重写回xml文件呢?
如果需要更改xml写回xml文件需要用到TransformerFactory回写类,代码如下:
1 //创建回写类的工厂类对象 2 TransformerFactory factory1 =TransformerFactory.newInstance(); 3 //创建回写类 4 Transformer transform = factory1.newTransformer(); 5 //调用回写类的回写方法,回写XML(注意需要的两个参数,均需new new DOMSource(document对象),new StreamResult("xml路径")) 6 transform.transform(new DOMSource(document),new StreamResult(""));
这样,通过以上的方代码就可以把对xml做的操作写回到xml文件中;对于获取xml的document对象和写回类我们发现在很多地方都重复使用,那么久可以把它们封装为一个独立的方法调用,封装后如下(仅用于学习理解,不适用与实际开发):
public class JAXPDemo { /** * 通过路径获得xml的Document对象 * @param path 路径 * @return */ public static Document GetXMLDocument(String path) throws Exception { //获取解析器工厂类对象 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //获取解析器对象 DocumentBuilder builder = factory.newDocumentBuilder(); //加载路径 Document document = builder.parse(path); return document; } /** * 回写方法 * @param document document对象 * @param path 指定路径 * @return 成功ok 失败error */ public static Boolean WriteXmlFile(Document document,String path) { //获取重写工厂类TransformerFactory对象 TransformerFactory factory = TransformerFactory.newInstance(); Transformer former;//创建回写类 try { former = factory.newTransformer(); //回写 former.transform(new DOMSource(document), new StreamResult(path)); return true;//成功 } catch ( Exception e) { return false;//失败 } } }
以上就是基本的JAXP的使用方法