【问题标题】:Can't edit/update xml file无法编辑/更新 xml 文件
【发布时间】:2015-04-09 14:05:44
【问题描述】:

我正在开发一个 android 应用程序,我想读取和编辑存储在设备内部存储器中的 xml 文件(该文件通过 USB 传输到设备的特定文件夹,而不是由应用程序创建)。为此,我使用 Java 的 DOMxmlParser,但是当我想保存更新版本的 xml 文件时遇到问题。我已经在我的 PC 中测试了我的编辑功能(作为一个简单的 Java 应用程序)并且它运行良好,但是当我在 android 应用程序中使用完全相同的代码但 xml 文件没有发生任何更改并且我没有收到任何错误时。我也想要明确该文件是可访问的,因为我可以从应用程序内部打印其数据。请帮忙

这是一些代码:

清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tsiskos.training1" >

<uses-sdk android:minSdkVersion="11" />

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


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

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.AppCompat.Light.DarkActionBar" >
    <activity
        android:name=".MyActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".DisplayMessageActivity"
        android:label="@string/app_name"
        android:parentActivityName=".MyActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.tsiskos.training1.MyActivity" />
    </activity>
    <activity
        android:name=".EditContact"
        android:label="@string/title_activity_edit_contact" >
    </activity>
</application>

XML 编辑功能

  public void editContact(String number,String oldName,String oldLimit,String newName,String newLimit) {

    try {
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        Document xmlDocument = builder.parse(new File(xmlPath));


        NodeList numbers = xmlDocument.getElementsByTagName("number");
        for (int i = 0; i < numbers.getLength(); i++) {
            if (((Element) numbers.item(i)).getAttribute("id").equals(number)) {

                Element currNumber = (Element) numbers.item(i);
                NodeList childs = currNumber.getChildNodes();
                for (int j = 0; j < childs.getLength(); j++) {
                    Node currElement = childs.item(j);
                    if (currElement.getNodeName().equals("contact")) {
                        NodeList currContact = currElement.getChildNodes();
                        for (int k = 0; k < currContact.getLength(); k++) {
                            Node currContactChild = currContact.item(k);
                            String currNode = currContactChild.getNodeName();
                            String currValue = currContactChild.getTextContent();
                            if (currNode.equals("name") && currValue.equals(oldName)) {

                                currContactChild.setTextContent(newName);
                            }
                            if (currNode.equals("limit") && currValue.equals(oldLimit)) {

                                currContactChild.setTextContent(newLimit);
                            }

                        }
                    }
                }
            }

        }


        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        DOMSource source = new DOMSource(xmlDocument);
        StreamResult result = new StreamResult(new File(xmlPath));



        transformer.transform(source, result);

        return xmlDocument;
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (TransformerConfigurationException e) {
        e.printStackTrace();
    } catch (TransformerException e) {
        e.printStackTrace();
    }

}

我确定的是文件的读取和解析是成功的。 我是否错过了与 Android 文件系统相关的重要内容? 提前致谢。

【问题讨论】:

  • 不确定为什么 StreamResult 类无法写入文件,但您是否尝试将结果写入字符串,然后将字符串输出到文件。只要您拥有正确的权限集,就可以在 Android 中使用标准的 Java 文件 I/O 操作。
  • 您确定您的设备 SDK 低于 18 吗?因为您已将此android:maxSdkVersion="18" 包含在android:name="android.permission.WRITE_EXTERNAL_STORAGE" 权限中

标签: java android xml file


【解决方案1】:

显然问题出在清单文件上。我尝试将结果写入字符串,然后写入 Sanj 评论的文件(调试提示:P),我得到了之前看不到的权限被拒绝错误。 虽然我已经包含了 write-external-permission,但我找到了this post 的答案 建议使用许可标签的不同位置。

所以诀窍是移动

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

就在清单文件末尾之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多