Android中解析xml文件的几种方式

xml文件用于传输数据文件的。xml文件的格式如下:

<?xml version=1.0 encoding="utf-8"?>
<book>  //在xml文件里面标签是可以自定义的
   <bookname>冰与火之歌</bookname>
   <price>90</price>
</book>


解析xml文件的方式有几种:

一:DOM方式解析xml文件

public class MainActivity extends Activity {

    private TextView textView1,textView2;
    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView1 = (TextView) findViewById(R.id.textview1);
        textView2 = (TextView) findViewById(R.id.textview2);
        button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new mylistener());
    }

    private class mylistener implements OnClickListener{

        @Override
        public void onClick(View v) {
            //如果sdcard不存在,返回被调用处
            if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
                return;
            }
            //sdcard存在的话,获取xml文件的路径
            //sdcard的根目录/myfile/myxml.xml  File.separator的详细用法解释在——>File.separator的详细用法<--可见
            File file = new File(Environment.getExternalStorageDirectory().toString()
                    +File.separator+"myfile"+File.separator+"myxml.xml");

            if(!file.exists()){
                return;//如果文件不存在返回被调用的地方
            }

            //DocumentBuilderFactory.newInstance()方法返回一个一个新的DocumentBuilderFactory
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            try {
                DocumentBuilder builder = factory.newDocumentBuilder();//通过factory实例化一个DocumentBuilder

                Document doc = builder.parse(file);//解析指定的xml文件同时返回一个document对象

                NodeList nl = doc.getElementsByTagName("bookname");//返回一个包含所有节点叫做bookname的结点列表

                for(int i = 0;i<nl.getLength();i++){
                    Element element = (Element) nl.item(i);//循环取得每一个元素
                    textView1.setText(element.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());
                    textView2.setText(element.getElementsByTagName("price").item(0).getFirstChild().getNodeValue());

                }

            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

二:DOM方式建立xml创建xml文件

比如要创建这样一个xml文件

<?xml version=1.0 encoding="utf-8"?>
<addresslist>
    <linkman>
         <name>张三</name>
         <email>zhangsan@163.com</email>
     </linkman>
</addresslist>

代码如下:

public class MainActivity extends Activity {

    private TextView textView1,textView2;
    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView1 = (TextView) findViewById(R.id.textview1);
        textView2 = (TextView) findViewById(R.id.textview2);
        button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new mylistener());
    }

    private class mylistener implements OnClickListener{

        @Override
        public void onClick(View v) {
            //如果sdcard不存在,返回被调用处
            if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
                return;
            }
            //sdcard存在的话,获取xml文件的路径
            //sdcard的根目录/myfile/myxml.xml  File.separator的详细用法解释在——>File.separator的详细用法<--可见
            File file = new File(Environment.getExternalStorageDirectory().toString()
                    +File.separator+"myfile"+File.separator+"myxml.xml");

            if(!file.exists()){
                return;//如果文件不存在返回被调用的地方
            }

            //DocumentBuilderFactory.newInstance()方法返回一个一个新的DocumentBuilderFactory
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            try {
                DocumentBuilder builder = factory.newDocumentBuilder();//通过factory实例化一个DocumentBuilder
                Document doc = builder.newDocument();//创建一个新的文档

                //建立xml文件的操作结点
                Element addresslist = doc.createElement("addresslist");
                Element linkman = doc.createElement("linkman");
                Element name = doc.createElement("name");
                Element email = doc.createElement("email");

                //设置结点内容为用户的输入值.appendChild()方法用于添加子节点,
                // 比如 linkman.appendChild(name);意思是给linkman结点添加子节点name
                name.appendChild(doc.createTextNode(textView1.getText().toString()));//把texteview1的内容设置为结点name的内容
                email.appendChild(doc.createTextNode(textView2.getText().toString()));//把texteview2的内容设置为结点name的内容

                linkman.appendChild(name);
                linkman.appendChild(email);
                addresslist.appendChild(linkman);
                doc.appendChild(addresslist);

//输出文档到文件中
                TransformerFactory tf = TransformerFactory.newInstance();
                try {
                    Transformer transformer = tf.newTransformer();
                    transformer.setOutputProperty(OutputKeys.ENCODING,"utf-8");//设置编码

                    DOMSource source =new  DOMSource(doc);//承接一个DOM树的转型结果
                    StreamResult result = new StreamResult(file);//为转型结果指定输出路径
                    transformer.transform(source,result);//将转型好的DOM资源转型输出到result指定的路径中


                } catch (TransformerConfigurationException e) {
                    e.printStackTrace();
                } catch (TransformerException e) {
                    e.printStackTrace();
                }
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            }
        }
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值