位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效果可能会不理想
首先来了解点Java DOM 的 API:
1.解析器工厂类:DocumentBuilderFactory
创建的方法:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
2.解析器:DocumentBuilder
创建方法:通过解析器工厂类来获得 DocumentBuilder db = dbf.newDocumentBuilder();
3.文档树模型Document
创建方法:a.通过xml文档 Document doc = db.parse("bean.xml"); b.将需要解析的xml文档转化为输入流InputStream is = new FileInputStream("bean.xml");
Document doc = db.parse(is);
Document对象代表了一个XML文档的模型树,所有的其他Node都以一定的顺序包含在Document对象之内,排列成一个树状结构,以后对XML文档的所有操作都与解析器无关,
直接在这个Document对象上进行操作即可;
包含的方法:
4.节点列表类NodeList
NodeList代表了一个包含一个或者多个Node的列表,根据操作可以将其简化的看做为数组
5.节点类Node
Node对象是DOM中最基本的对象,代表了文档树中的抽象节点。但在实际使用中很少会直接使用Node对象,而是使用Node对象的子对象Element,Attr,Text等
6.元素类Element
是Node类最主要的子对象,在元素中可以包含属性,因而Element中有存取其属性的方法
7.属性类Attr
代表某个元素的属性,虽然Attr继承自Node接口,但因为Attr是包含在Element中的,但并不能将其看做是Element的子对象,因为Attr并不是DOM树的一部分
</bookstore>
package com.tg.parse; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; 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; import com.tg.beans.Book; public class DomParseService { public List<Book> getBooks() throws ParserConfigurationException, SAXException, IOException{ List<Book> list = new ArrayList<Book>(); //得到DOM解析器的工厂实例 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //从DOM工厂中获得DOM解析器 DocumentBuilder builder = factory.newDocumentBuilder(); //把要解析的xml文档读入DOM解析器 Document document = builder.parse("book.xml"); //得到文档的元素 Element element = document.getDocumentElement(); //得到文档名称为book的元素的节点列表 NodeList bookNodes = element.getElementsByTagName("book"); for(int i=0;i<bookNodes.getLength();i++){ Element bookElement = (Element) bookNodes.item(i); Book book = new Book(); book.setCategory(bookElement.getAttribute("category")); NodeList childNodes = bookElement.getChildNodes(); // System.out.println("*****"+childNodes.getLength()); for(int j=0;j<childNodes.getLength();j++){ if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE){ if("title".equals(childNodes.item(j).getNodeName())){ book.setTitle(childNodes.item(j).getFirstChild().getNodeValue()); System.out.println(childNodes.item(j).getFirstChild().getNodeValue()); }else if("price".equals(childNodes.item(j).getNodeName())){ book.setPrice(Float.parseFloat(childNodes.item(j).getFirstChild().getNodeValue())); System.out.println(childNodes.item(j).getFirstChild().getNodeValue()); } else if("author".equals(childNodes.item(j).getNodeName())){ book.setAuthor(childNodes.item(j).getFirstChild().getNodeValue()); System.out.println(childNodes.item(j).getFirstChild().getNodeValue()); } else if("year".equals(childNodes.item(j).getNodeName())){ book.setYear(childNodes.item(j).getFirstChild().getNodeValue()); System.out.println(childNodes.item(j).getFirstChild().getNodeValue()); } } }//end for j list.add(book); }//end for i return list; } /** * 向已存在的xml文件中插入元素 * */ public void insertXml(){ Element bookstore = null; Element book = null; Element title = null; Element year = null; Element author = null; Element price = null; try{ //得到DOM解析器的工厂实例 DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); //从DOM工厂中获得DOM解析器 DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder(); //把要解析的xml文档读入DOM解析器 Document doc = dbBuilder.parse("book.xml"); System.out.println("asa"+doc); //得到文档名称为book的元素的节点列表 NodeList nList = doc.getElementsByTagName("bookstore"); bookstore = (Element)nList.item(0); //创建名称为book的元素 book = doc.createElement("book"); //设置元素book的属性值为231 book.setAttribute("category", "men"); //创建名称为Name的元素 title = doc.createElement("title"); //创建名称为 香香 的文本节点并作为子节点添加到name元素中 title.appendChild(doc.createTextNode("C语言")); //将name子元素添加到book中 book.appendChild(title); /** * 下面的元素依次加入即可 * */ year = doc.createElement("year"); year.appendChild(doc.createTextNode("2020")); book.appendChild(year); author = doc.createElement("author"); author.appendChild(doc.createTextNode("汤高")); book.appendChild(author); price = doc.createElement("price"); price.appendChild(doc.createTextNode("22.22")); book.appendChild(price); //将book作为子元素添加到树的根节点bookstore bookstore.appendChild(book); //将内存中的文档通过文件流生成insertbookstore.xml,XmlDocument位于crison.jar下 }catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { DomParseService dom=new DomParseService(); dom.getBooks(); dom.insertXml(); dom.getBooks(); } }
结果