Android使用Pull方式进行Xml文件解析

熟知的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)第一篇笔记,请大家多多指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值