4-SIII-Android数据固化之Xml的Dom解析和存储

mac2022-06-30  111

零、前言

Xml是一种应用广泛的标记语言,我们常见的html便是它的子集。形如:<XXX>xxx</XXX>组成的闭合标签 安卓的res目录下的xml想必大家都是否熟悉,它们最终都是在代码中被读取并解析发挥效果的 安卓的SharedPreferences是以Xml的形式存储数据的,就连AndroidManifest注意一看也是Xml 可以说xml涉及到了安卓的很多方面,我们并不陌生,Xml最大的好处就是解耦,容易复用和更换 安卓的Xml解析有Pull解析、Sax解析和Dom解析,这篇说Dom解析与存储

DOM解析概述:
DOM将整个XML文件加载到内存中,并构建出节点树; 应用程序可以通过遍历节点树的方式来解析XML文件中的各个节点、属性等信息; 优点:对XML节点的添加修改等,而且解析也很方便 缺点比较耗费内存,解析速度也不快
准备的待解析xml:
<?xml version="1.0" encoding="UTF-8"?> <weapons> <weapon material="玉" type="剑"> <name>问天剑</name> <atk>2000</atk> <user>语熙华</user> </weapon> <weapon material="铁" type="刀"> <name>皇刀</name> <atk>3000</atk> <user>九方玄玉</user> </weapon> </weapons>

一、dom解析Xml

/** * dom解析Xml * @return */ private ArrayList<WeaponXml> parseXmlWithDom() { mWeapons = new ArrayList<>(); InputStream is = null; try { is = getAssets().open("weapon.xml"); //获取document对象 Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is); //获取根元素 Element root = dom.getDocumentElement(); //获取weapon节点 NodeList weaponNode = root.getElementsByTagName("weapon"); for (int i = 0; i < weaponNode.getLength(); i++) { mWeapon = new WeaponXml(); //获取person下第i个元素 Element weaponEl = (Element) weaponNode.item(i); String material = weaponEl.getAttribute("material");//得到第i个属性值 String type = weaponEl.getAttribute("type");//得到第i个属性值 mWeapon.setMaterial(material); mWeapon.setType(type); NodeList childNodes = weaponEl.getChildNodes();//获得获取weapon下子元素 for (int j = 0; j < childNodes.getLength(); j++) { if (childNodes.item(j).getNodeType() == Node.ELEMENT_NODE) { String nodeName = childNodes.item(j).getNodeName(); if ("name".equals(nodeName)) { String name = childNodes.item(j).getFirstChild().getNodeValue(); mWeapon.setName(name); } else if ("atk".equals(nodeName)) { String atk = childNodes.item(j).getFirstChild().getNodeValue(); mWeapon.setAtk(Integer.parseInt(atk)); } else if ("user".equals(nodeName)) { String user = childNodes.item(j).getFirstChild().getNodeValue(); mWeapon.setUser(user); } } } mWeapons.add(mWeapon); } } catch (Exception e) { e.printStackTrace(); } return mWeapons; }

二、dom存储Xml

/** * sax创建Xml文件 */ private void domCreateXml() { try { ArrayList<WeaponXml> weaponXmls = parseXmlWithDom(); //创建Dom解析器 DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); //新建空白文档 Document doc = builder.newDocument(); //建立根元素employees Element root = doc.createElement("weapons"); //将根节点添加进入文档 doc.appendChild(root); for (WeaponXml weaponXml : weaponXmls) { Element weapon = doc.createElement("weapon"); weapon.setAttribute("material", weaponXml.getMaterial()); weapon.setAttribute("type", weaponXml.getType()); root.appendChild(weapon); Element name = doc.createElement("name"); name.appendChild(doc.createTextNode(weaponXml.getName())); weapon.appendChild(name); Element atk = doc.createElement("atk"); atk.appendChild(doc.createTextNode(weaponXml.getAtk()+"")); weapon.appendChild(atk); Element user = doc.createElement("user"); user.appendChild(doc.createTextNode(weaponXml.getUser())); weapon.appendChild(user); } //为了得到xslt引擎创建对象 TransformerFactory tff = TransformerFactory.newInstance(); //创建xslt引擎对象输出xml文档 Transformer tf = tff.newTransformer(); //获取属性对象 Properties pro = tf.getOutputProperties(); //设置编码格式和输出格式 pro.setProperty(OutputKeys.ENCODING, "utf-8"); pro.setProperty(OutputKeys.METHOD, "xml"); tf.setOutputProperties(pro); //创建资源对象 DOMSource source = new DOMSource(doc); String path = Environment.getExternalStorageDirectory().getAbsolutePath() +File.separator+"WeaponDom.xml"; //获得输出对象 StreamResult result = new StreamResult(new File(path)); //执行dom文档到xml文件转换 tf.transform(source, result); } catch (Exception e) { e.printStackTrace(); }

后记、

1.声明:

[1]本文由张风捷特烈原创,转载请注明 [2]欢迎广大编程爱好者共同交流 [3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正 [4]你的喜欢与支持将是我最大的动力

2.连接传送门:

更多安卓技术欢迎访问:安卓技术栈 我的github地址:欢迎star 简书首发,腾讯云+社区同步更新 张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com

3.联系我

QQ:1981462002 邮箱:1981462002@qq.com 微信:zdl1994328

4.欢迎关注我的微信公众号,最新精彩文章,及时送达:
公众号.jpg

转载于:https://www.cnblogs.com/toly-top/p/9781889.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)