xml文件

一般我们都会在网络上传输一些格式化后的数据,这种数据会有一定的结构规格和语义, 当另一方收到数据消息之后就可以按照相同的

结构规格进行解析,从而取出他想要的那部分内容,在网络上传输数据时最常用的格式有两种,XML 和 JSON。目前先大概总结下xml文件的创建与解析。

第一,创建方法,步骤如下:

1,获取序列化器 XmlSerializer serializer = Xml.newSerializer();

2,初始化序列化器 serializer.setOutput(os, "utf-8");

3,按照一定的格式写入数据,其格式图片示例如下所示:

xml文件怎么生成 python xml文件的生成方法_json

serializer.startDocument("utf-8", true); 写文档头 包括编码
serializer.startTag(命名空间,数据);写开始标签 
serializer.text(); 写文本数据 
serializer.endTag(null, "num"); 写结束标签
serializer.endDocument();写文档末尾


实际操作如下:

4,关闭数据流 os.close

第二,解析方法,步骤如下:

通常解析方法有pull解析和sax解析,先来学习下pull解析方法,类似于sax解析,但是效率更高,内存开销更小;解析与创建是个逆过程,所以类似:

1, 创建解析器 XmlPullParser parser = Xml.newPullParser();

2,初始化解析器

InputStream inputStream = this.getAssets().open("10001.xml"); //打开目标文件xml
parser.setInput(inputStream, "utf-8"); //初始化
3,解析数据
第一步,获取事件的类型 int type=parser.getEventType();
第二步,while循环以及switch语句判断获取事件类型,
while (type!=XmlPullParser.END_DOCUMENT){
switch (type) { 
case XmlPullParser.START_TAG: 
if ("name".equals(parser.getName())) { //这是姓名节点 
String name=parser.nextText(); 
sb.append("姓名"+name); 
} else if("num".equals(parser.getText())) {//这是学号节点 
String num=parser.nextText(); 
sb.append("学号"+num); 
} 
break; 
}type = parser.next();//让解析器解析下一个元素 
}


xml文件怎么生成 python xml文件的生成方法_json_02

用xml存储和解析的小案例,学生管理系统

(心得,写代码一定要细心,绝对不能粗心,不说能大概就可以了,不然会埋下好多隐患。。bug。。。,比如大小写,代码提示选错了等等。。。。处理起来好浪费时间。。。)

xml文件怎么生成 python xml文件的生成方法_android_03

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:gravity="center_horizontal" 
android:orientation="vertical" 
><ImageView 
android:layout_width="130dp" 
android:layout_height="130dp" 
android:src="@drawable/ic_launcher"/><LinearLayout 
android:orientation="horizontal" 
android:layout_width="match_parent" 
android:layout_height="wrap_content"><TextView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="姓名" 
android:textSize="18sp" /><EditText 
android:id="@+id/name" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:ems="10" 
android:inputType="textPersonName" 
android:hint="请输入姓名" /> 
</LinearLayout> 
<LinearLayout 
android:orientation="horizontal" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" ><TextView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="学号" 
android:textSize="18sp"/><EditText 
android:id="@+id/number" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:ems="10" 
android:inputType="number" 
android:hint="请输入学号" /> 
</LinearLayout> 
<Button 
android:onClick="saveInfo" 
android:id="@+id/save" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="点击保存" 
android:textColor="#ffffff" /> 
<ScrollView 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 
<LinearLayout 
android:id="@+id/show" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
></LinearLayout> 
</ScrollView> 
</LinearLayout> 源代码:
package com.example.studentinfo;
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException;import org.xmlpull.v1.XmlPullParser; 
import org.xmlpull.v1.XmlPullParserException; 
import org.xmlpull.v1.XmlSerializer;import android.os.Bundle; 
import android.os.Environment; 
import android.app.Activity; 
import android.text.TextUtils; 
import android.util.Log; 
import android.util.Xml; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.LinearLayout; 
import android.widget.TextView; 
import android.widget.Toast;public class MainActivity extends Activity { 
private EditText name; 
private EditText num; 
private LinearLayout show; 
private Button save; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
name=(EditText)findViewById(R.id.name); 
num=(EditText)findViewById(R.id.number); 
show=(LinearLayout)findViewById(R.id.show); 
save=(Button)findViewById(R.id.save); 
refleshData();//开启界面后刷新数据 
} 
/* 
* 刷新数据的方法 
*/ 
public void refleshData(){ 
show.removeAllViews(); 
File files=getFilesDir(); 
for (File file : files.listFiles()) { 

readXmlData(file); 
} 

} 
/* 
* 点击方法 
*/ 
public void saveInfo(View v){ 
String NAME=name.getText().toString().trim(); 
String NUM=num.getText().toString().trim(); 
/* 
* 
* 1,创建一个序列化器 
* 2,初始化序列化器 
* 3,写入数据 
*/ 
if (TextUtils.isEmpty(NAME)||TextUtils.isEmpty(NUM)) { 
Toast.makeText(this, "输入不能为空,请重新输入", 0).show(); 
} else { 

try { 

File file =new File(getFilesDir(),NAME+".xml"); 
FileOutputStream os=new FileOutputStream(file);//打开一个输入流 
XmlSerializer serializer=Xml.newSerializer();//XmlSerializer是个接口,用Xml中newSerializer对象去实现它 
serializer.setOutput(os, "utf-8"); 
serializer.startDocument("utf-8", true);// utf-8表示编码模式,true表示该文件是独立的 
serializer.startTag(null, "student");//参数以为该文件的命名空间,参数二为标签名 
serializer.startTag(null, "name"); 
serializer.text(NAME); 
serializer.endTag(null, "name"); 
serializer.startTag(null, "num"); 
serializer.text(NUM); 
serializer.endTag(null, "num"); 
serializer.endTag(null, "student"); 
serializer.endDocument(); 
os.close(); //关闭数据流 
Toast.makeText(this, "保存成功", 0).show(); 
} catch (Exception e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
Toast.makeText(this, "保存失败", 0).show(); 
} 
/* 
* 
* 保存成功以后刷新数据 
*/ 
refleshData(); 
} 

} 

/* 
* 读取xml文件方法 
*/ 
public void readXmlData(File file){ 
XmlPullParser parser=Xml.newPullParser(); 

try { 
FileInputStream inputStream=new FileInputStream(file); 
parser.setInput(inputStream, "utf-8");//初始化后便获取指针 
/* 
* 
* 读取xml数据方法: 
* 1,获取解析器 
* 2,初始化数据,获取指针 
* 3,读取数据: 
* 第一步:得到事件类型,int类型数据 
* 第二步:switch判断数据类型 
*/ 
int type=parser.getEventType(); 
StringBuilder sb = new StringBuilder(); 
while (type!=XmlPullParser.END_DOCUMENT){ 
switch (type) { 
case XmlPullParser.START_TAG: 
if ("name".equals(parser.getName())) { //这是姓名节点 
String name=parser.nextText(); 
sb.append("姓名:"+name); 
} else if("num".equals(parser.getName())) {//这是学号节点 
String num=parser.nextText(); 
sb.append("学号:"+num); 
} 
break; 
} 
type=parser.next();//让解析器不停往下解析 我果然是手一抖,就忘记了写上type,导致死循环 
Log.i("tag", "死循环了"); 
Log.i("tag", "又死循环了"); 
Log.i("tag", "又又死循环了"); 

} 
inputStream.close(); 
String info=sb.toString(); 
TextView tv=new TextView(this); 
tv.setText(info); 
show.addView(tv); 
Log.i("tag", ""+num); 
} catch (Exception e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
TextView tv = new TextView(this); 
tv.setText("这条数据无效"); 
show.addView(tv); 
} 


} 
}