【问题标题】:cannot insert new XML node with DOM parser无法使用 DOM 解析器插入新的 XML 节点
【发布时间】:2014-11-28 15:41:46
【问题描述】:

我遇到了一个奇怪的问题

很快,这是我想添加一个新的person 节点的 XML

<persons>
<person name="name1" surname="surname1" /> 
<person name="name2" surname="surname2" /> 
<person name="name3" surname="surname3" /> 
<person name="name4" surname="surname4" /> 
<person name="name5" surname="surname5" />
</persons>

这是我的 Android 代码:

                    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                    Document doc = dBuilder.parse(personsFile);                   
                    doc.getDocumentElement().normalize();

                    Element persons = doc.getDocumentElement();

                    Element personNode = doc.createElement("person");                       

                    personNode.setAttribute("name", "name6");                       
                    personNode.setAttribute("surname", "surname6");

                    persons.appendChild(personNode);

                    Transformer tf = TransformerFactory.newInstance().newTransformer();
                    DOMSource source = new DOMSource(doc);
                    StreamResult result = new StreamResult(personsFile);
                    tf.transform(source, result);

但是新节点没有完全插入, 我收到了这个

<persons>
<person name="name1" surname="surname1" /> 
<person name="name2" surname="surname2" /> 
<person name="name3" surname="surname3" /> 
<person name="name4" surname="surname4" /> 
<person name="name5" surname="surname5" />
<person na

对于这个版本的代码(没有设置属性):

            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(personsFile);                   
            doc.getDocumentElement().normalize();

            Element persons = doc.getDocumentElement();

            Element personNode = doc.createElement("person");                       

            //personNode.setAttribute("name", "name6");                       
            //personNode.setAttribute("surname", "surname6");

            persons.appendChild(personNode);

            Transformer tf = TransformerFactory.newInstance().newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(personsFile);
            tf.transform(source, result);

我收到以下 XML

<persons>
<person name="name1" surname="surname1" /> 
<person name="name2" surname="surname2" /> 
<person name="name3" surname="surname3" /> 
<person name="name4" surname="surname4" /> 
<person name="name5" surname="surname5" />
<person/><

即就像在第一种情况下,它不能保存超出一定的边界,

我无法理解这个问题, 在我之前用过的pad上,效果很好,现在我用的是索尼Xperia

编辑。尝试保存到另一个(新的)XML 文件中并且它可以工作,但仍然无法理解为什么 DOM 树没有完全保存到原始文件中

编辑2。有没有搞错。当我将新的(有效的)XML 文件重命名回原始文件时,它会像原始文件一样损坏。我很沮丧

【问题讨论】:

  • 看起来像流刷新问题,尝试显式刷新输出流并关闭它。

标签: java android xml parsing


【解决方案1】:

似乎文件本身没有问题,并且所有必要的节点都已正确写入 XML。令人惊讶的是,当在 Windows 7 文件资源管理器中打开该文件时,该文件看起来已损坏,这确实具有误导性。当我使用 Android 自己的文本查看器打开 pad 内的文件时,它正确显示了所有节点(文件本身位于外部存储中,因此它(或至少应该)在 Windows 中是可浏览的。
该文件实际上是首先在 Windows 7 中创建的,然后移动到选项卡的外部存储中,所以在这种情况下,我猜,Windows 以某种方式保持文件原始容器的大小,并且不反映对文件所做的任何更改超出该大小

附言。 Sony Xperia 的另一个令人困惑的功能是外部存储上的某些文件和文件夹没有显示在 Windows 文件资源管理器中,包括用户在 Android 文件资源管理器中明确创建的文件和文件夹。因此,如果我在 Android 的文件资源管理器中创建文件/文件夹,它将隐藏在 Windows 文件资源管理器中。但反之亦然

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多