如何在安卓设备中读取XML文件

13

我想读取以下格式的XML文件...我将其存储在assets文件夹中,内容如下:

<ImageList SpriteSheetName="hh_gmw01">
   <Image Name="gmw01"     x="0" y="0" width="1047" height="752"/>
   <Image Name="hht1l01"   x="388" y="269" width="34" height="36"/>
   <Image Name="hht1l02"   x="147" y="99" width="85" height="33"/>
</ImageList>

我该如何获取这些值?


6个回答

8

首先,请尝试以下操作:

import java.io.IOException;
import java.io.InputStream;

import android.app.Activity;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class Main extends Activity {

Button btn;
TextView tvXml;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button btn = (Button) findViewById(R.id.button1);

    btn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // Load XML for parsing.
            AssetManager assetManager = getAssets();
            InputStream inputStream = null;
            try {
                inputStream = assetManager.open("textxml.xml");
            } catch (IOException e) {
                Log.e("tag", e.getMessage());
            }

            String s = readTextFile(inputStream);
            TextView tv = (TextView)findViewById(R.id.textView1);
            tv.setText(s);
        }
    });
}


private String readTextFile(InputStream inputStream) {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

    byte buf[] = new byte[1024];
    int len;
    try {
        while ((len = inputStream.read(buf)) != -1) {
            outputStream.write(buf, 0, len);
        }
        outputStream.close();
        inputStream.close();
    } catch (IOException e) {

    }
    return outputStream.toString();
}
}

OP接受了这个答案吗?它只是将文件内容加载到TextView中。对我来说,“获取这些值”意味着将XML解析为单独的属性值。 - undefined

4

在安卓中,有几种方法可以读取XML。我的第一个选择是DocumentBuilder,因为它不会创建API版本限制(自API Level 1起可用)。

下面是我的一个项目示例:

public Document parseXML(InputSource source) {
    try {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(false);
        dbf.setValidating(false);
        DocumentBuilder db = dbf.newDocumentBuilder();
        return db.parse(source);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
 }

如何读取文件并访问文档值?这很基础,只需要谷歌一下就行了。


告诉我们去谷歌搜索并不是很有价值。我就是通过这种方式来到这里的。不过,这个问题的焦点不像Stack Overflow上的问题那样明确,所以我理解。对我来说,这对于在Android上使用XML是有用的起点。 - undefined

2
要开始使用DOM解析器。因为它的代码更少,易于理解。SAX解析器太过复杂,不易上手。有人会争辩说SAX更快,是的确实如此,但DOM更易用,代码更少,漏洞更少。
如果你必须转向SAX,请先测量在使用DOM时的响应时间,并只有在解析成为最大痛点时才转向SAX。否则,DOM做得很好。

DOM解析器是什么? - undefined

2
/*
* <ImageList SpriteSheetName="hh_gmw01">
*       <Image Name="gmw01"     x="0" y="0" width="1047" height="752"/>
*       <Image Name="hht1l01"   x="388" y="269" width="34" height="36"/>
*       <Image Name="hht1l02"   x="147" y="99" width="85" height="33"/>
* </ImageList>
*/

private void testXML() throws XmlPullParserException {
    AssetManager assetManager = getAssets();
    try {
        InputStream xmlStream = assetManager.open("xmlfile.xml");
        try {
            XmlPullParser xmlParser = Xml.newPullParser();
            xmlParser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
            xmlParser.setInput(xmlStream, null);
            xmlParser.nextTag();

            int imgNum = 0;
            xmlParser.require(XmlPullParser.START_TAG, null, "ImageList"/*root node*/);
            Log.d("ImageList", "SpriteSheetName = " + xmlParser.getAttributeValue(null, "SpriteSheetName"));
            while (xmlParser.next() != XmlPullParser.END_TAG) {
                if (xmlParser.getEventType() != XmlPullParser.START_TAG) {
                    continue;
                }

                xmlParser.require(XmlPullParser.START_TAG, null, "Image");
                //. fetch nodes attributes here...
                Log.d("xmlNode", "img " + (++imgNum) +
                           " Name = " + xmlParser.getAttributeValue(null, "Name") +
                        " x = "       + xmlParser.getAttributeValue(null, "x") +
                        " y = "       + xmlParser.getAttributeValue(null, "y") +
                        " width = "   + xmlParser.getAttributeValue(null, "width") +
                        " height = "  + xmlParser.getAttributeValue(null, "height")
                );
                //................................
                xmlParser.nextTag();
                xmlParser.require(XmlPullParser.END_TAG, null, "Image");
            }


        } finally {
            xmlStream.close();
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
    assetManager.close();
}

1

-1

针对Xamarin.Android(跨平台),可以尝试以下方法:

您需要将XML文件存储到具有“AndroidAsset”构建操作的Assets文件夹中。

using System;
using System.Xml;
using System.IO;

读取XML文件的代码片段

XmlDocument xDoc = new XmlDocument();
Stream xmlStream = Assets.Open("textxml.xml");
xDoc.Load(xmlStream);

XmlDocument类实现了.NET Framework的核心XML文档对象模型(DOM)解析器。


尽管结果是跨平台的,但我不确定在一般情况下使用.NET开发Android应用程序是否明智。现在回答已被编辑并且可能可行了(无法在我的计算机系统上测试,Xamarin不可用),我已经点赞了这个回答。 - barefootliam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接