熟知的XML解析方式有SAX,DOM,Pull三种,笔者采用Pull方式对xml进行了解析操作。
以案例入手学习:
对本地xml文件进行解析,首先把xml文件放入到assets文件夹下。
1.xml文件格式及内容:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<property>
<stroke strokeOrderID="1">
<point>
<x>0.3957644418569711</x>
<y>0.2659047522911659</y>
<time>3297905204488</time>
</point>
<point>
<x>0.3983964186448317</x>
<y>0.27089658297025243</y>
<time>3297953825779</time>
</point>
</stroke>
<stroke strokeOrderID="2">
<point>
<x>0.39984853891225963</x>
<y>0.27289330115685095</y>
<time>3297957191363</time>
</point>
<point>
<x>0.40139141376201926</x>
<y>0.27407320462740387</y>
<time>3297973859446</time>
</point>
</stroke>
</property>
(在这个xml文件中,我们发现在根标签之中有:与,而且point在stroke之中,这种情况我们需要注意一下,首先把point内的x,y,time放入到集合中,再把point加上strokeOrderID放入到stroke这个集合之中。)
2.point类,对于x、y和time进行封装:
public class Point {
public double x;
public double y;
public long time;
public double getX()
{
return x;
}
public void setX(double x)
{
this.x = x;
}
public double getY()
{
return y;
}
public void setY(double y)
{
this.y = y;
}
public long getTime()
{
return time;
}
public void setTime(long time)
{
this.time = time;
}
public String toString()
{
return "Point [x=" + x + ", y=" + y + ", time=" + time + "]";
}
}
3.声明一个stroke类,对point和strokeOrderID进行封装
public class Stroke {
private int strokeOrderID;
private List<Point> originalPosition= new ArrayList<Point>();
public int getStrokeOrderID() {
return strokeOrderID;
}
public void setStrokeOrderID(int strokeOrderID) {
this.strokeOrderID = strokeOrderID;
}
public List<Point> getOriginalPosition() {
return originalPosition;
}
public void setOriginalPosition(List<Point> originalPoint) {
this.originalPosition = originalPoint;
}
@Override
public String toString() {
return "Stroke [strokeOrderID=" + strokeOrderID + ", originalPosition=" + originalPosition + "]";
}
}
4.创建工具类Xmlparser
public class Xmlparser extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_xmlparser);
}
public static List<Stroke> getStrokes(InputStream xml) throws Exception {
List<Stroke> strokes = new ArrayList<Stroke>();
List<Point> points = new ArrayList<Point>();
Point point = null;
Stroke stroke = null;
strokes = new ArrayList<Stroke>();
points = new ArrayList<Point>();
XmlPullParser pullParser = Xml.newPullParser();
pullParser.setInput(xml, "UTF-8"); //为Pull解释器设置要解析的XML数据
int event = pullParser.getEventType();
while (event != XmlPullParser.END_DOCUMENT){
switch (event) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
if ("stroke".equals(pullParser.getName())){
int id = Integer.valueOf(pullParser.getAttributeValue(0));
points = new ArrayList<Point>();
stroke = new Stroke();
stroke.setStrokeOrderID(id);
}
if ("point".equals(pullParser.getName())){
point = new Point();
}
if ("x".equals(pullParser.getName())){
String x = pullParser.nextText();
point.setX(Double.parseDouble(x));
}
if ("y".equals(pullParser.getName())){
String y = pullParser.nextText();
point.setY(Double.parseDouble(y));
}
if ("time".equals(pullParser.getName())){
String time = pullParser.nextText();
point.setTime( Long.parseLong(time));
}
break;
case XmlPullParser.END_TAG:
if ("point".equals(pullParser.getName())){
points.add(point);
}
if ("stroke".equals(pullParser.getName())){
stroke.setOriginalPosition(points);
strokes.add(stroke);
}
break;
}
event = pullParser.next();
}
return strokes;
}
}
5.编写MainActivity代码进行结果显示
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_xml;
TextView tv_mainxml;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_xml=(Button)findViewById(R.id.btn_xml);
btn_xml.setOnClickListener(this);
tv_mainxml=(TextView)findViewById(R.id.tv_mainxml);
}
public void onClick(View v){
switch (v.getId()){
case R.id.btn_xml:
try{
InputStream in =getAssets().open("jiao.xml");
List<Stroke> stroke =Xmlparser.getStrokes(in);
StringBuffer sb = new StringBuffer();
for(Stroke strokes :stroke) {
sb.append(stroke.toString());
}
tv_mainxml.setText(sb.toString());
}catch(Exception e){e.printStackTrace();}
}
}
}
MainActivity对应的XML显示文件内容如下:
<TextView
android:id="@+id/tv_mainxml"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_xml"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
tools:layout_editor_absoluteX="16dp"
tools:layout_editor_absoluteY="16dp" />
6.在Android Studio新建一个项目,编写stroke与point封装类,xmlparser工具类,在MainActivity中调用工具类,采用点击Button在Textview中显示结果的方式进行练习,运行结果如下:
7.笔者练习总结:
(1)本次进行xml解析不需要导入第三方包
(2)在练习前把xml文件用记事本打开看一下格式是否正确,不要有空格或者没有格式化的情况(我就是因为有空格,导致异常,出现了一个小错误)
(3)采用pull方式代码没有那么多容易实现和理解 ,XmlPullParser方式主要的属性有:
XmlpullParser.START_DOCUMENT:XML文档的开始
XmlpullParser.END_DOCUMENT:XML文档的结束
XmlpullParser.START_TAG:开始节点。XML文件中,带有尖括号<>的都是开始节点
XmlpullParser.END_TAG:结束节点,带有</>都是结束节点
(4)第一篇笔记,请大家多多指正。