零、前言
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