Java解析XML
Java解析XML有三种方式
1.DOM解析
优点: 1、形成了树结构,有助于更好的理解、掌握,且代码容易编写。
2、解析过程中,树结构保存在内存中,方便修改。
缺点: 1、由于文件是一次性读取,所以对内存的耗费比较大。
2、如果XML文件比较大,容易影响解析性能且可能会造成内存溢出。
XML: (三种方式解析的都是一个XML)
<books>
<!-- ctrl+shift+/ -->
<book id="001" type="1">
<bookName>钢铁是怎样练成的</bookName>
<bookPrice>56</bookPrice>
<bookAuthor>奥斯特洛夫斯基</bookAuthor>
<bookPublisher>北大出版社</bookPublisher>
</book>
<book id="002" type="2">
<bookName>你是人间的四月天</bookName>
<bookPrice>86</bookPrice>
<bookAuthor>林徽因</bookAuthor>
<bookPublisher>徐志摩出版社</bookPublisher>
</book>
<book id="004">
<bookPrice>22</bookPrice>
<bookName>112</bookName>
</book>
</books>
解析XML:
//创建解析器
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder Builder=factory.newDocumentBuilder();
//获取文档对象
Document document = Builder.parse("book.xml");
//节点集合
NodeList node = document.getElementsByTagName("book");
//循环解析
for (int i = 0; i < node.getLength(); i++) {
Element item =(Element) node.item(i);
String bookid = item.getAttribute("id");
String bookname = item.getAttribute("type");
System.out.println(bookid+"\t"+bookname);
}
在XML中添加元素
private static void addXML() throws Exception{
//前面三步跟解析的一样
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder Builder = factory.newDocumentBuilder();
Document document = Builder.parse("book.xml");
//创建根节点
Element book = document.createElement("book");
book.setAttribute("id","004");
//添加根节点下的其他元素
Element bookname = document.createElement("bookName");
bookname.setTextContent("lalal");
Element price = document.createElement("bookPrice");
price.setTextContent("22");
Element author = document.createElement("bookAuthor");
author.setTextContent("12");
Element publisher = document.createElement("bookPublisher");
publisher.setTextContent("44444");
//添加到book根节点中
book.appendChild(bookname);
book.appendChild(price);
book.appendChild(bookname);
document.getElementsByTagName("books").item(0).appendChild(book);
//写到硬盘中
TransformerFactory factory2=TransformerFactory.newInstance();
Transformer newTransformer = factory2.newTransformer();
Source source=new DOMSource(document);
Result result=new StreamResult("book.xml");
newTransformer.transform(source, result);
System.out.println("sava ok");
}
修改XML中的元素
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder Builder = factory.newDocumentBuilder();
Document document = Builder.parse("book.xml");
//获取xml第几个根节点,根据需求更改item()中的值
Element item =(Element) document.getElementsByTagName("books").item(3);
document.getElementsByTagName("bookName").item(0).removeChild(item);
TransformerFactory factory2=TransformerFactory.newInstance();
Transformer newTransformer = factory2.newTransformer();
Source source=new DOMSource(document);
Result result=new StreamResult("book.xml");
newTransformer.transform(source, result);
System.out.println("Update ok");
删除xml中的元素
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder Builder = factory.newDocumentBuilder();
Document document = Builder.parse("book.xml");
//获取xml第几个根节点,根据需求更改item()中的值
Node item = document.getElementsByTagName("book").item(1);
document.getElementsByTagName("books").item(0).removeChild(item);
TransformerFactory factory2=TransformerFactory.newInstance();
Transformer newTransformer = factory2.newTransformer();
Source source=new DOMSource(document);
Result result=new StreamResult("book.xml");
newTransformer.transform(source, result);
System.out.println("dalete ok");
2.使用DOM4J解析
特征: 1、JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能。
2、它使用接口和抽象基本类方法。
3、具有性能优异、灵活性好、功能强大和极端易用的特点。
4、是一个开放源码的文件
在使用DOM4J解析,需要使用dom4j-1.6.1.jar架包
读取XML
//和.NET 中 //不需要借助工厂 //01.解析器 SAXReader reader=new SAXReader(); //02.加载文档 Document document = reader.read("src/book2.xml"); //03.获取根节点 Element root = document.getRootElement(); //04.获取根节点下所有的直节点 List<Element> list = root.elements(); //05.遍历 for (Element element : list) { //一个element代表一本书 System.out.println( element.element("书名").getText()); System.out.println( element.element("作者").attribute("name").getText()); }
添加元素:
SAXReader reader=new SAXReader(); //02.加载文档 Document document = reader.read("src/book.xml"); //03.获取根节点 Element root = document.getRootElement(); //04.获取根节点下所有的直节点 List<Element> list = root.elements(); //获取第一本书的对象 //创建一个Element Element ele=DocumentHelper.createElement("出版时间"); ele.setText("2015年5月21日17:35:09"); list.get(0).add(ele); //没重新写入到xml文件中 Writer writer=new OutputStreamWriter(new FileOutputStream("book.xml"),"utf-8");(尽量加上utf-8,否则会乱码)
document.write(writer); writer.close();
修改XML元素
SAXReader reader=new SAXReader(); //02.加载文档 Document document = reader.read("src/book.xml"); //03.获取根节点 Element root = document.getRootElement(); List<Element> elements = root.elements(); Element firstBook = elements.get(1); Element bookname = firstBook.element("bookName"); bookname.setText("22222"); //写入硬盘 Writer writer=new OutputStreamWriter(new FileOutputStream("src/book.xml"),"utf-8"); document.write(writer); writer.close(); System.out.println("modify ok!");
删除XML元素
SAXReader reader=new SAXReader(); //02.加载文档 Document document = reader.read("src/book.xml"); //03.获取根节点 Element root = document.getRootElement(); Element firstBook = root.element("book"); Element delEle = firstBook.element("bookName"); firstBook.remove(delEle); //写入硬盘 Writer writer=new OutputStreamWriter(new FileOutputStream("src/book.xml"),"utf-8"); document.write(writer); writer.close();
3.SAX解析
SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。
优点:
1、采用事件驱动模式,对内存耗费比较小。
2、适用于只处理XML文件中的数据时。
缺点:
1、编码比较麻烦。
2、很难同时访问XML文件中的多处不同数据。