前言
xml主要分为两类:
事件型驱动 sax、pull 等
一个标签一个标签的加载,主要是以handler函数为代表,注意维护父子关系。
//以作者愚见,所谓“事件型驱动 ”就是遇到触发点(标签)然后执行你编辑的代码
加载文档 DOM
一下加载整个文档,然后进行操作
PULL解析XML是Android中自带的解析工具,愚以为一般xml文件都用此便可。所以本文主要讲它,在本文最后还会介绍其他解析方式。
xml(我放在了res/xml下):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<wai name="wai1">
<!-- 背夹厂商对应包名,不允许轻易修改 -->
<string name="zhigao">MainActivity1</string>
<string name="other">MainActivity2</string>
</wai>
<wai name="wai2">
<!-- 背夹厂商对应包名,不允许轻易修改 -->
<string name="zhigao2">MainActivity1</string>
<string name="other2">MainActivity2</string>
</wai>
</resources>
重点方法:(为了方便,下面都是静态方法)
··· java
private static String TAG="main";
public static ArrayList<String> pullParseXml(int resource,
Context context) {
XmlResourceParser xmlParser = context.getResources().getXml(resource);
ArrayList<String> CityArray = new ArrayList<String>();
String string = null;
try {
// 开始解析事件
int eventType = xmlParser.getEventType();
// 处理事件,不碰到文档结束就一直处理
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
if (!xmlParser.getName().equals("resources")) {
Toast.makeText(context, xmlParser.getAttributeValue(0) + "",
Toast.LENGTH_LONG).show();
if (xmlParser.getName().equals("string")) {
Log.d("main", xmlParser.nextText());}
}}
// 别忘了用next方法处理下一个事件,忘了的结果就成死循环#_#
eventType = xmlParser.next();
}
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return CityArray;
}
public static void writeXml(List<String> persons,OutputStream outStream) throws IllegalArgumentException, IllegalStateException, IOException{
XmlSerializer xmlSerializer = Xml.newSerializer();
xmlSerializer.setOutput(outStream, "UTF-8");
xmlSerializer.startDocument("UTF-8", true);//--><?xml ... ?>
xmlSerializer.startTag(null, "persons");
for(String person:persons){
xmlSerializer.startTag(null, "person");
xmlSerializer.attribute(null, "id", person);
xmlSerializer.endTag(null, "person");
}
xmlSerializer.endTag(null, "persons");
xmlSerializer.endDocument();
outStream.flush();//要刷新缓冲区
outStream.close();
Log.d(TAG, outStream.toString());
}
···
调用的地方:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
XmlAnalytic.pullParseXml(R.xml.imate, this);
List<String> persons=new ArrayList<String>();
for (int i = 0; i < 5; i++) {
persons.add(i+"");
}
File file=new File(Environment
.getExternalStorageDirectory().getPath()+"//"+"newmyxml.xml");
if(!file.isFile()){
try {
file.createNewFile();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}}
Log.d("main", Environment
.getExternalStorageDirectory().getPath());
FileOutputStream outStream;
try {
outStream = new FileOutputStream(file);
XmlAnalytic.writeXml(persons, outStream);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
demo:
其他技术比较:
1. DOM4J性能最好,如果你不考虑可移植性,那就采用DOM4J.
2. JDOM和DOM性能测试表现不佳,在测试10M文档时内存溢出,但可移植
3. SAX表现较好,这依赖于特定的解析方式-事件驱动。不全部加载到内存。