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

前言

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

先看一个简单的 xml 文件:

如何成功书名>

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 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 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 方式,一面实际内存不足造成闪退。

总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值