Android中对xml文件解析的3种方式总结

时间:2021-05-20

前言

xml 是数据传输的一种格式,Android 中的布局文件、设置文件等都采用它来表示。Android 中对 xml 文件的解析也有多种方式,下面介绍常用的 3 种方式: Dom 、 SAX 和 dom4j。下面话不多说了,来一起看看详细的介绍吧。

先看一个简单的 xml 文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> <书 出版社="骏马"> <书名>如何成功</书名> <作者>uniapp</作者> <售价>666</售价> </书> <书> <书名>如何成功1</书名> <作者>uniapp</作者> <售价>1991</售价> </书></书架>

1、Dom解析方式

Dom 解析通过 Document 类将整个 xml 文件一次读入内存,然后通过操作 Document 实例的属性实现对 xml 文件中元素的增删改查,具体代码如下:

2 SAX解析

SAX 对 xml 文件采用边读边解析的方式,就像我们用眼睛读文章一样,一行一行的进行。相比 Dom 方式产生的瞬时内存峰值,SAX 对内存的消耗比较平稳。它通过解析类提供对外接口,具体实现:

public class SaxDemo { @Test public void main() throws ParserConfigurationException, SAXException, IOException{ //工厂类实例 SAXParserFactory fac = SAXParserFactory.newInstance(); //创建解析器 SAXParser parser = fac.newSAXParser(); //解析文档 XMLReader reader = parser.getXMLReader(); reader.setContentHandler(new MyDefultHandle()); reader.parse("./app/src/main/java/test/DTD.xml"); }}class MyDefultHandle extends DefaultHandler{ @Override public void startDocument() throws SAXException { super.startDocument(); System.out.println("文档开始"); } @Override public void endDocument() throws SAXException { super.endDocument(); System.out.println("文档结束"); } private boolean isPrice = false; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); System.out.println("元素开始: " + qName); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); if ("售价".equals(qName)){ isPrice = false; } System.out.println("元素结束: " + qName); } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); if (isPrice){ System.out.println("内容: " + new String(ch, start, length)); } }}

3 Dom4j 解析

Dom4j 解析是第三开源库给出的解析方式,结合了 Dom 和 SAX 双方的优点,对 xml 文件逐步读入内存,并且可以采用面向对象的方式访问节点。代码如下:

/** * 读取属性值 * */ public void readAttr() throws DocumentException { Document doc = getDocument(); List<Element> list = doc.getRootElement().elements("书"); for (int i = 0; i < list.size(); i++) { Element el = (Element) list.get(i); Attribute att = el.attribute("出版社"); System.out.print("结果: " + att.getName() + att.getValue()); } } /** * 读取节点 * */ public void read() throws DocumentException { /** * 不能越级获取值 * */ Document doc = getDocument(); org.dom4j.Element el = doc.getRootElement(); Element firstEl = el.element("书"); Element firstBookEl = firstEl.element("书名"); String name = firstBookEl.getText(); System.out.println("书名: " + name); } public void update() throws DocumentException, IOException { Document doc = getDocument(); List<Element> list = doc.getRootElement().elements("书"); Element element = list.get(0); Element priceEl = element.element("售价"); priceEl.setText("888元"); XMLWriter writer = new XMLWriter(new FileOutputStream("./app/src/main/java/test/Dom4j3.xml")); writer.write(doc); } /** * 删除节点 * */ public void deletePrice() throws Exception{ SAXReader reader = new SAXReader(); Document doc = reader.read("./app/src/main/java/test/Dom4j1.xml"); Element el = (Element) doc.getRootElement().elements("书").get(1); Element elPrice = (Element) el.elements("售价").get(1); elPrice.getParent().remove(elPrice); XMLWriter writer = new XMLWriter(new FileOutputStream("./app/src/main/java/test/Dom4j2.xml")); writer.write(doc); writer.close(); } /** * 增加节点 * */ public void addEl() throws DocumentException, IOException { Document doc = getDocument(); Element el = (Element) doc.getRootElement().elements("书").get(1); el.addElement("售价").setText("6.66元"); XMLWriter writer = new XMLWriter(new FileOutputStream("./app/src/main/java/test/Dom4j1.xml")); writer.write(doc); writer.close(); } private Document getDocument() throws DocumentException { SAXReader reader = new SAXReader(); return reader.read("./app/src/main/java/test/DTD.xml"); }

结合以上三种解析方式的特点,我们可以得出结论:如果 xml 文件很小,可以选择面向对象的 Dom 或者 dom4j 方式;反之可以选择 SAX 方式,一面实际内存不足造成闪退。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章