无法使用DOM解析器插入新的XML节点

时间:2014-11-28 15:41:46

标签: java android xml parsing

我遇到了一个奇怪的问题

很快,这是我想要添加新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/><

即。就像在第一种情况下一样,它无法保存超出某个边界,

我无法理解这个问题, 在我之前使用过的垫子上,这完全有效,现在我正在使用Sony Xperia

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

EDIT2。有没有搞错。当我将新的(有效的)XML文件重命名回原始文件时,它就像原始文件一样被破坏。我很沮丧

1 个答案:

答案 0 :(得分:0)

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

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