发布于 2016-10-08 15:24:53 | 140 次阅读 | 评论: 0 | 来源: PHPERZ

这里有新鲜出炉的精品教程,程序狗速度看过来!

XML可扩展标记语言

xml 即 可扩展标记语言 。 可扩展标记语言,标准通用标记语言的子集,一种用于标记电子文件使其具有结构性的标记语言。


什么是XML

XML全称为Extensible Markup Language, 意思是可扩展的标记语言,它是 SGML(标准通用标记语言)的一个子集。

XML语法上和HTML比较相似,但HTML中的元素是固定的,而XML的标签是可以由用户自定义的。

W3C在1998年2月发布1.0版本;
W3C在2004年2月发布1.1版本,但因为1.1版本不能向下兼容1.0版本,所以1.1没有人用。同时,在2004年2月W3C又发布了1.0版本的第三版。我们要学习的还是1.0版本!!!

W3C组织

W3C是万维网联盟(World Wide Web Consortium)英文的缩写,它成立于1994年10月,以开放论坛的方式来促进开发互通技术(包括规格、指南、软件和工具),开发网络的全部潜能。万维网联盟(W3C)从1994年成立以来,已发布了90多份Web技术规范,领导着Web技术向前发展。

W3C认为自身不是官方组织,因此将它正式发布的规范称为推荐(建议)标准,意思是进一步标准化的建议,但是由于组织自身的权威性往往成为事实上的标准。

XML的作用

  • 程序的配置文件(这也是最后大家使用XML最常见的目的);
  • 数据交换:不同语言之间用来交换数据;
  • 小型数据库:用来当数据库存储数据。

XML与HTML比较

  • HTML的元素都是固定的,而XML可以自定义元素;
  • HTML用浏览器来解析执行, XML的解析器通常需要自己来写(因为元素是自定义的);
  • HTML只能用来表示网页,而XML可以做的事情很多。

XML和properties(属性文件)比较

  • 属性文件只能存储平面信息,而XML可以存储结构化信息;
  • 解析属性文件只需要使用Properties类就可以了,而解析XML文档是很复杂的。

XML文档的组成部分

  • XML文档声明;重要
  • XML处理指令;看完了,就可以忘了!
  • XML元素;最重要
  • XML特殊字符和CDATA区;一看就会
  • XML注释。不看都会
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<students>
    <student number="1001">
        <name>zhangSan</name>
        <age>23</age>
        <sex>male</sex>
    </student>
    <student number="1002">
        <name>liSi</name>
        <age>32</age>
        <sex>female</sex>
    </student>
    <student number="1003">
        <name>wangWu</name>
        <age>55</age>
        <sex>male</sex>
    </student>
</students>

什么是xml文档声明

可以把xml文档声明看成是xml文档说明。
最简单的xml文档声明:< ?xml version=”1.0”? >
注意,XML是区别大小写,这一点不同与HTML!

xml文档声明结构

  • version属性
    用于说明当前xml文档的版本,因为都是在用1.0,所以这个属性值大家都写1.0,version属性是必须的;

  • encoding属性
    用于说明当前xml文档使用的字符编码集,xml解析器会使用这个编码来解析xml文档。encoding属性是可选的,默认为UTF-8。注意,如果当前xml文档使用的字符编码集是gb2312,而encoding属性的值为UTF-8,那么一定会出错的;

  • standalone属性
    用于说明当前xml文档是否为独立文档,如果该属性值为yes,表示当前xml文档是独立的,如果为no表示当前xml文档不是独立的,即依赖外部的文件。默认是yes

  • 没有xml文档声明的xml文档,不是格式良好的xml文档;

  • xml文档声明必须从xml文档的1行1列开始。

XML实战案例

使用xml 作为数据交互的载体是Android 中非常重要的功能,比如天气预报数据、短信备份数据、通讯录数据都可以以xml 的格式通过网络传输。

为了演示Xml 数据的操作,我模拟了一个短信备份的案例。

需求:界面如图1-10 所示。上面是三个Button,前两个分别对应两种不同方式生成xml,第三个Button点击后解析备份的xml 文件,然后将数据展现在下面的ScrollView 中。短信数据是模拟的假数据。

布局文件

<RelativeLayout 
    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"
    tools:context=".MainActivity" >

    <ListView 
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

ListView的item布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <com.loopj.android.image.SmartImageView 
        android:id="@+id/iv"
        android:layout_width="90dp"
        android:layout_height="70dp"
        android:src="@drawable/ic_launcher"
        android:layout_centerVertical="true"/>
    <TextView 
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="这是大标题志哥教你上塑料"
        android:layout_toRightOf="@id/iv"
        android:textSize="22sp"
        android:singleLine="true"
        />
     <TextView 
         android:id="@+id/tv_detail"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="这是正文志哥教你带崩三路"
        android:layout_toRightOf="@id/iv"
        android:layout_below="@id/tv_title"
        android:textSize="15sp"
        android:textColor="@android:color/darker_gray"
        android:lines="2"
        />
      <TextView 
          android:id="@+id/tv_comment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="65031条评论"
        android:textColor="#ff0000"
        android:layout_alignParentRight="true"
        android:layout_below="@id/tv_detail"
        />
</RelativeLayout>

实体bean

public class News {

    private String title;
    private String detail;
    private String comment;
    private String imageUrl;

    @Override
    public String toString() {
        return "News [title=" + title + ", detail=" + detail + ", comment="
                + comment + ", imageUrl=" + imageUrl + "]";
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDetail() {
        return detail;
    }

    public void setDetail(String detail) {
        this.detail = detail;
    }

    public String getComment() {
        return comment;
    }

    public void setComment(String comment) {
        this.comment = comment;
    }

    public String getImageUrl() {
        return imageUrl;
    }

    public void setImageUrl(String imageUrl) {
        this.imageUrl = imageUrl;
    }
}

实现代码

public class MainActivity extends Activity {

    List<News> newsList;
    Handler handler = new Handler(){
        public void handleMessage(android.os.Message msg) {
            ListView lv = (ListView) findViewById(R.id.lv);
            lv.setAdapter(new MyAdapter());
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getNewsInfo();
//      ListView lv = (ListView) findViewById(R.id.lv);
//      //要保证在设置适配器时,新闻xml文件已经解析完毕了
//      lv.setAdapter(new MyAdapter());
    }

    class MyAdapter extends BaseAdapter{

        //得到模型层中元素的数量,用来确定listview需要有多少个条目
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return newsList.size();
        }
        @Override
        //返回一个View对象,作为listview的条目显示至界面
        public View getView(int position, View convertView, ViewGroup parent) {

            News news = newsList.get(position);
            View v = null;
            ViewHolder mHolder;
            if(convertView == null){
                v = View.inflate(MainActivity.this, R.layout.item_listview, null);
                mHolder = new ViewHolder();
                //把布局文件中所有组件的对象封装至ViewHolder对象中
                mHolder.tv_title = (TextView) v.findViewById(R.id.tv_title);
                mHolder.tv_detail = (TextView) v.findViewById(R.id.tv_detail);
                mHolder.tv_comment = (TextView) v.findViewById(R.id.tv_comment);
                mHolder.siv = (SmartImageView) v.findViewById(R.id.iv);
                //把ViewHolder对象封装至View对象中
                v.setTag(mHolder);
            }
            else{
                v = convertView;
                mHolder = (ViewHolder) v.getTag();
            }
            //给三个文本框设置内容
            mHolder.tv_title.setText(news.getTitle());

            mHolder.tv_detail.setText(news.getDetail());

            mHolder.tv_comment.setText(news.getComment() + "条评论");

            //给新闻图片imageview设置内容
            mHolder.siv.setImageUrl(news.getImageUrl());
            return v;
        }

        class ViewHolder{
            //条目的布局文件中有什么组件,这里就定义什么属性
            TextView tv_title;
            TextView tv_detail;
            TextView tv_comment;
            SmartImageView siv;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }
    }
    private void getNewsInfo() {
        Thread t = new Thread(){
            @Override
            public void run() {
                String path = "http://192.168.13.13:8080/news.xml";
                try {
                    URL url = new URL(path);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("GET");
                    conn.setConnectTimeout(5000);
                    conn.setReadTimeout(5000);
                    //发送http GET请求,获取相应码
                    if(conn.getResponseCode() == 200){
                        InputStream is = conn.getInputStream();
                        //使用pull解析器,解析这个流
                        parseNewsXml(is);
                    }
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
        t.start();
    }

    private void parseNewsXml(InputStream is) {
        XmlPullParser xp = Xml.newPullParser();
        try {
            xp.setInput(is, "utf-8");
            //对节点的事件类型进行判断,就可以知道当前节点是什么节点
            int type = xp.getEventType();
            News news = null;
            while(type != XmlPullParser.END_DOCUMENT){
                switch (type) {
                case XmlPullParser.START_TAG:
                    if("newslist".equals(xp.getName())){
                        newsList = new ArrayList<News>();
                    }
                    else if("news".equals(xp.getName())){
                        news = new News();
                    }
                    else if("title".equals(xp.getName())){
                        String title = xp.nextText();
                        news.setTitle(title);
                    }
                    else if("detail".equals(xp.getName())){
                        String detail = xp.nextText();
                        news.setDetail(detail);
                    }
                    else if("comment".equals(xp.getName())){
                        String comment = xp.nextText();
                        news.setComment(comment);
                    }
                    else if("image".equals(xp.getName())){
                        String image = xp.nextText();
                        news.setImageUrl(image);
                    }
                    break;
                case XmlPullParser.END_TAG:
                    if("news".equals(xp.getName())){
                        newsList.add(news);
                    }
                    break;

                }
                //解析完当前节点后,把指针移动至下一个节点,并返回它的事件类型
                type = xp.next();
            }
            //发消息,让主线程设置listview的适配器,如果消息不需要携带数据,可以发送空消息
            handler.sendEmptyMessage(1);
//          for (News n : newsList) {
//              System.out.println(n.toString());
//          }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}


最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务