Android:写入xml

时间:2013-05-14 09:46:45

标签: android xml xml-parsing

我有一个名为weatherdata.xml的xml(它位于我的eclipse的> assets<文件夹中),它看起来像

<?xml version="1.0" encoding="utf-8"?>
<Weather>
<weatherdata>
    <id>1</id>
    <city>Berlin</city>
    <tempc>0°C</tempc>
    <tempf>32°F</tempf>
    <condition>Snowing</condition>
    <windspeed>5 kmph</windspeed>
    <icon>snowing</icon>
</weatherdata>
    <weatherdata>
    <id>5</id>
    <city>Sydney</city>
    <tempc>32°C</tempc>
    <tempf>89.6°F</tempf>
    <condition>Sunny</condition>
    <windspeed>10 kmph</windspeed>
    <icon>sunny</icon>
</weatherdata>

所以我试图在运行时添加一个城市..我尝试单独使用java并且与this

工作正常

我认为它可以与android一起运行,但是因为android功能与桌面应用程序完全不同所以不能再进一步了

我发现this很有趣,(虽然没有附加)

所以我的问题是

  • 这个SD卡是什么,我需要写信给它吗

  • 所以如果我写sdcard我可以期望在模拟器上和实际设备上输出相同的输出

  • 如果是,那么这将是路径 - /sdcard/weatherdata.xml

除此之外,是否有任何权利(manifest.xml)困扰我写入xml文件

3 个答案:

答案 0 :(得分:1)

资产是作为APK的一部分打包的只读文件。你无法改变它们。

您可以在2个地方为应用程序编写文件:

  1. SD卡(或“外部存储”)
  2. 手机内存上应用程序的专用数据区
  3. 这些有点不同,有不同的优点/缺点,如下:

    1. SD卡:

      • 卸载应用程序时,不会删除您在SD卡上写的文件
      • 您需要READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE权限才能访问SD卡上的文件
      • 某些设备没有SD卡支持或者用户可能没有在插槽中安装SD卡
      • 用户可以删除/替换/格式化SD卡,在这种情况下,您在那里写的任何文件都将丢失
      • 用户可以通过将设备连接到PC或移除SD卡并将其安装在PC上来读取/写入SD卡上的任何文件
    2. 私人数据区:

      • 卸载应用时,您在此处写的文件将被删除
      • 用户无法读取或写入这些文件(除非他的手机已植根)
      • 您不需要任何私人数据区域的读/写权限
    3. 我建议您将XML文件从资源复制到私有数据区(如果它还没有),然后始终使用私有数据区中的副本。如果要向其添加条目,则在私有数据区域中更新副本。

      要在私人数据区域中打开文件,请使用openFileInput()openFileOutput()。模拟器上的行为与设备上的行为相同。

答案 1 :(得分:0)

1)sdcard是您编写文件的地方(请注意,您在eclipse中的assets文件夹中的xml将不在那里,它将与您的应用程序捆绑在一起)

2)是的,仿真器和物理设备上的行为应该相同

3)您可以为文件选择所需的名称,但请注意,它与您在资产中放置的文件不同(参见1)。此外,您应该使用Environment.getExternalStorageDirectory();而不是硬编码目录。

您需要将其添加到清单中:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

答案 2 :(得分:0)

这就是我的方式

 try {
        File file = getBaseContext().getFileStreamPath("weather.xml");
        if (file.exists()) 
        {
            Log.d("weather.xml", "File Found !!!");
            FileOutputStream fOut = getApplicationContext().openFileOutput(
                    "weather.xml", MODE_APPEND);
            OutputStreamWriter osw = new OutputStreamWriter(fOut);
            String fileContent = "<Weather><weatherdata><city>Versace</city></weatherdata></Weather>"; 
            osw.write(fileContent);
            osw.flush();
            osw.close();
            Log.d("write mode: ", "MODE_APPEND");
        }
        else
        {
                FileOutputStream fOut = getApplicationContext().openFileOutput(
                "weather.xml", MODE_PRIVATE);
                OutputStreamWriter osw = new OutputStreamWriter(fOut);
                String fileContent = "<?xml version="1.0" encoding="utf-8"?><Weather><weatherdata><city>Berlin</city></weatherdata></Weather>"; 

                osw.write(fileContent);
                osw.flush();
                osw.close();
                Log.d("write mode: ", "MODE_PRIVATE");
        }
        Log.d("status", "Finished writing to XML");
    } catch (FileNotFoundException e) { Log.e("Error", "XML writing exception");
    } catch (IOException e) { e.printStackTrace(); }

此处感兴趣的是写入模式,MODE_APPEND-用于附加已存在的xml文件,MODE_PRIVATE用于创建新文件,并写入。最后是getBaseContext()。getFileStreamPath(),用于检查目标文件是否存在..