Dom解析、生成XML文件

编程入门 行业动态 更新时间:2024-10-15 02:32:52

Dom解析、生成XML<a href=https://www.elefans.com/category/jswz/34/1771438.html style=文件"/>

Dom解析、生成XML文件

在java中,原生解析xml文档的方式有两种,分别是:Dom解析和Sax解析

Dom解析功能强大,可增删改查,操作时会将xml文档以文档对象的方式读取到内存中,因此适用于小文档.

Document对象代表了一个XML文档的模型树(类似于数据结构中的树),所有的其他Node都以一定的顺序包含在Document对象之内,排列成一个树状结构,以后对XML文档的所有操作都与解析器无关,直接在这个Document对象上进行操作即可;

代码如下:

package com.vgbh;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.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;public class DomXMLDemo {public static void main(String[] args) {DomXMLDemo dxd = new DomXMLDemo();String uri = "bookstore.xml";String uri1 = "F:/WorkSpace/domB.xml";//dxd.insertDomXMLDemo(uri1, "一生有你", "午歌", "25", "chinese", "china");//当XML文件中有数据时,该方法会进行覆盖。//dxd.queryDomXMLDemo(uri);dxd.updateDomXMLDemo(uri, "0", "changedName");}//遍历XML文件public void queryDomXMLDemo (String uri) {try {//创建DOM解析器的工厂实例DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();//从DOM工厂中获取DOM解析器DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();//将解析文件传入DOM解析器Document doc = dbBuilder.parse(uri);//System.out.println("处理文件的DomImplenementation对象 = " + doc.getImplementation());//获取处理此文档的DOMImplenementation对象//获取文档名称为book的元素的节点列表NodeList bookList = doc.getElementsByTagName("book");//遍历该集合for (int i = 0 ;i < bookList.getLength();i ++) {System.out.println("----------开始第" + (i+1) + "遍历。-------------");Element e = (Element)bookList.item(i);System.out.println("name:" + e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());System.out.println("author:" + e.getElementsByTagName("author").item(0).getFirstChild().getNodeValue());System.out.println("price:" + e.getElementsByTagName("price").item(0).getFirstChild().getNodeValue());System.out.println("language:" + e.getElementsByTagName("language").item(0).getFirstChild().getNodeValue());System.out.println("country:" + e.getElementsByTagName("country").item(0).getFirstChild().getNodeValue());System.out.println("----------第" + (i+1) + "遍历结束。--------------");/** 对于特定的方法可以查看API文档* getElementsByTagName()   按文档数序返回具有特定标记的NodeList* item()   返回集合中的第index个顶* getFirstChild()    * getNodeValue()*/ }} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}//写入XML文件,该文件为新的文件public void insertDomXMLDemo (String uri, String names, String authors, String prices, String languages, String countrys) {Document doc ;Element bookstore , book ;Element name = null ;Element author = null ;Element price = null ;Element language = null ;Element country = null ;try {//创建DOM解析器的工厂实例DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();//从DOM工厂中获取DOM解析器DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();//创建文档树模型对象doc = dbBuilder.newDocument();if (doc != null) {//创建bookstore元素bookstore = doc.createElement("booksore");//创建book元素book = doc.createElement("book");//设置book的id属性值,并且设置name, author, price, language, country book.setAttribute("id", "3");name = doc.createElement("name");language = doc.createElement("language");author = doc.createElement("author");price = doc.createElement("price");country = doc.createElement("country");//设置name子节点的属性值name.appendChild(doc.createTextNode(names));author.appendChild(doc.createTextNode(authors));price.appendChild(doc.createTextNode(prices));language.appendChild(doc.createTextNode(languages));country.appendChild(doc.createTextNode(countrys));//将name, author, price, language, country添加到book中book.appendChild(name);book.appendChild(author);book.appendChild(price);book.appendChild(language);book.appendChild(country);//将book作为子元素加入bookstorebookstore.appendChild(book);//将bookstore作为子元素加入docdoc.appendChild(bookstore);//doc输出为XML文件//创建TransformerFactory解析器的工厂实例TransformerFactory tfFactory = TransformerFactory.newInstance();//从TransFormer工厂中获取TransFormer解析器Transformer tf = tfFactory.newTransformer();//设置输出时自动换行tf.setOutputProperty(OutputKeys.INDENT, "true");//使用transFormer的transform()函数将Dom转换为XML文件tf.transform(new DOMSource(doc), new StreamResult(uri));System.out.println("生成XML文件成功!");}} catch (ParserConfigurationException e) {e.printStackTrace();} catch (TransformerConfigurationException e) {e.printStackTrace();} catch (TransformerException e) {e.printStackTrace();}}//更新XML文件public void updateDomXMLDemo (String uri, String id, String name) {/** 更新文件:* 1、更新文件是在原有XML文件的基础上,获取到每一个元素book,* 2、在通过相应的localName获取到他的Element对象,* 3、最终通过修改这个Element对象实现完成修改,* 4、还需要将其修改后的值重新覆盖掉原来的数据。* * 还有一种情况,那就是添加一整条数据,方法类似写入XML文件,最后还需要输出XML文件*/try {//创建DOM解析器的工厂实例DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();//从DOM工厂中获取DOM解析器DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();//创建文档树模型对象Document doc = dbBuilder.parse(uri);//获取文档名称为book的元素的节点列表NodeList bookList = doc.getElementsByTagName("book");for (int i = 0; i < bookList.getLength(); i++) {if (String.valueOf(i).equals(id)) {Element e = (Element) bookList.item(i);e.getElementsByTagName("name").item(0).getFirstChild().setNodeValue(name);                  //System.out.println("   " + e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());break;}}//doc输出为XML文件//创建TransformerFactory解析器的工厂实例TransformerFactory tfFactory = TransformerFactory.newInstance();//从TransFormer工厂中获取TransFormer解析器Transformer tf = tfFactory.newTransformer();//设置输出时自动换行tf.setOutputProperty(OutputKeys.INDENT, "true");//使用transFormer的transform()函数将Dom转换为XML文件tf.transform(new DOMSource(doc), new StreamResult(uri));System.out.println("生成XML文件成功!");} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (TransformerConfigurationException e) {e.printStackTrace();} catch (TransformerException e) {e.printStackTrace();}}
}

1、queryDomXMLDemo的输出结果:

-----------------开始第1遍历。----------------------
name:cet4
author:college-English
price:55
language:english
country:2
-----------------第1遍历结束。----------------------
-----------------开始第2遍历。----------------------
name:cet6
author:me
price:33
language:lalalal
country:chinese
-----------------第2遍历结束。----------------------

从这里可以看出,dom遍历XML文件是追条进行遍历,所以只是用较小的XML文件,并且这样可以修改其中的值,完成数据更新。

2、insertDomXMLDemo的输出结果:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><booksore><book id="3"><name>一生有你</name><author>午歌</author><price>25</price><language>chinese</language><country>china</country></book></booksore>

输出结果显示没有换行,但是对于数据结构还是很完整的。

3、updateDomXMLDemo的输出结果:

//修改之前的数据
<?xml version="1.0" encoding="UTF-8" >
<bookstore><book id="1"><name>cet4</name><author>college-English</author><price>55</price><language>english</language><country>2</country></book><book id="2"><name>cet6</name><author>me</author><price>33</price><language>lalalal</language><country>chinese</country></book>
</bookstore>//修改之后的数据
<?xml version="1.0" encoding="UTF-8" standalone="no"?><bookstore><book id="1"><name>changedName</name><author>college-English</author><price>55</price><language>english</language><country>2</country></book><book id="2"><name>cet6</name><author>me</author><price>33</price><language>lalalal</language><country>chinese</country></book>
</bookstore>

上述的结果可以看出在经过修改XML文件后,数据替换,但是要注意XML文件的属性问题,例如编码格式的、版本号等变化所引起的问题。

终述:

对于以上的三种关于XML文件的解析、写入、更新方法,我觉得可以写出更具体的方法供这三种函数调用,具体就是问题细节化,这样可以省去大量的时间开发。

想理解XML文件的这三种函数,其实也很简单,将要解决的问题进行细分,然后按照不同的步骤进行解决,注重理解不同步骤之间的关系和顺序即可。

有问题的可以联系我的邮箱。

更多推荐

Dom解析、生成XML文件

本文发布于:2024-03-04 14:36:09,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1709540.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:文件   Dom   XML

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!