2014-11-28 2 views
0

я столкнулся со странным вопросомне может вставить новый узел XML с DOM парсер

Короче, вот XML, который я хотел бы, чтобы добавить новый person узлу

<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-файл обратно в исходный файл, он будет поврежден так же, как и исходный файл. Я полностью расстроен

+0

Похож на проблему с промывкой потока, попробуйте очистить поток и явно закрыть его. – Ironluca

ответ

0

Кажется, что сам файл был ОК, и все необходимые узлы были правильно записаны в XML. Удивительно, что файл выглядит поврежденным при открытии в проводнике файлов Windows 7, и это действительно вводит в заблуждение. Когда я открывал файл внутри пэда с помощью собственного текстового средства просмотра Android, он отображал все узлы правильно (сам файл находится на внешнем хранилище, поэтому он (или, по крайней мере, должен быть) доступен для просмотра в Windows).
Сначала файл был создан в Windows 7, а затем перемещен во внешнюю память вкладки, поэтому в этом случае, я думаю, Windows каким-то образом сохраняет размер исходного контейнера файла и не отражает никаких изменений, внесенных в файл за пределами этого размер

PS. Еще одна запутанная особенность Sony Xperia заключается в том, что некоторые файлы и папки на внешнем хранилище не отображаются в проводнике Windows, в том числе те, которые были явно созданы пользователем в проводнике файлов Android. Поэтому, если я создам файл/папку в проводнике файлов Android, он будет скрыт в проводнике Windows. Наоборот, это неверно, но

Смежные вопросы