Android移动架构汇总
在安卓中通常需要解析xml文件,获取想要的数据,例如:数据库升级时,对应不同版本有不同的sql语句,可以通过xml文件保存起来,那么如何在Android中解析xml文件呢?
##一、将xml文件转换为IO流
xml文件assets/updateXml.xml:
<updateXml>
<createVersion version="V003">
<createDb name="user">
<sql_createTable>
create table if not exists tb_user(
name TEXT,
password TEXT,
loginName TEXT,
lastLoginTime Long,
user_id Integer primary key
);
</sql_createTable>
</createDb>
<createDb name="logic">
<sql_createTable>
create table if not exists tb_photo(
time TEXT,
path TEXT,
to_user TEXT,
sendTime TEXT
);
</sql_createTable>
</createDb>
</createVersion>
</updateXml>
IO流解析,生成对应xml的API(Document):
InputStream is = null;
Document document = null;
try {
is = context.getAssets().open("updateXml.xml");
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
document = builder.parse(is);
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
##二、Xml解析的API
1、整个xml文档:Document获取元素节点集合
NodeList nodeList = document.getElementsByTagName("updateStep");
//updateStep 节点名称
2、元素节点Element中获取子节点集合
NodeList nodeList = ele.getElementsByTagName("updateDb");
//ele为Element类型,updateDb表示子节点名称
3、节点集合中获取节点
NodeList nodeList = document.getElementsByTagName("updateStep");
for (int i = 0; i < nodeList.getLength(); i++) {
Element ele = (Element) nodeList.item(i);
}
3、获取元素节点的属性
String version = ele.getAttribute("version");
4、获取元素节点的属性的内容
ele.getTextContent();
##三、解析
###1、每一个节点定义一个对应的类,用来描述记录其结构和相关属性
###2、从分支的子元素节点定义模型,从最上层的Document进行解析
##四、定义节点对应的类
public class UpdateDbXml
{
/**
* 升级版本
*/
private List<CreateVersion> createVersions;
public UpdateDbXml(Document document)
{
{
/**
* 获取各升级版本
*/
NodeList createVersions = document.getElementsByTagName("createVersion");
this.createVersions = new ArrayList<CreateVersion>();
for (int i = 0; i < createVersions.getLength(); i++)
{
Element ele = (Element) (createVersions.item(i));
CreateVersion cv = new CreateVersion(ele);
this.createVersions.add(cv);
}
}
}
public List<CreateVersion> getCreateVersions()
{
return createVersions;
}
public void setCreateVersions(List<CreateVersion> createVersions)
{
this.createVersions = createVersions;
}
}
public class CreateVersion
{
/**
* 版本信息
*/
private String version;
/**
* 创建数据库表脚本
*/
private List<CreateDb> createDbs;
public CreateVersion(Element ele)
{
version = ele.getAttribute("version");
{
createDbs = new ArrayList<CreateDb>();
NodeList cs = ele.getElementsByTagName("createDb");
for (int i = 0; i < cs.getLength(); i++)
{
Element ci = (Element) (cs.item(i));
CreateDb cd = new CreateDb(ci);
this.createDbs.add(cd);
}
}
}
public String getVersion()
{
return version;
}
public void setVersion(String version)
{
this.version = version;
}
public List<CreateDb> getCreateDbs()
{
return createDbs;
}
public void setCreateDbs(List<CreateDb> createDbs)
{
this.createDbs = createDbs;
}
}
public class CreateDb
{
/**
* 数据库表名
*/
private String name;
/**
* 创建表的sql语句集合
*/
private List<String> sqlCreates;
public CreateDb(Element ele)
{
name = ele.getAttribute("name");
{
sqlCreates = new ArrayList<String>();
NodeList sqls = ele.getElementsByTagName("sql_createTable");
for (int i = 0; i < sqls.getLength(); i++)
{
String sqlCreate = sqls.item(i).getTextContent();
this.sqlCreates.add(sqlCreate);
}
}
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public List<String> getSqlCreates()
{
return sqlCreates;
}
public void setSqlCreates(List<String> sqlCreates)
{
this.sqlCreates = sqlCreates;
}
}
##四、使用
UpdateDbXml xml = new UpdateDbXml(document)