2017-01-24 4 views
0

При первом запуске этой программы мне нужно создать xml, я сначала создаю файл и создаю объект Document, а затем преобразую его в объект Element.Объект элемента элемента преобразуется в текстовый узел после разбора XML

 xmlDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; 
     xmlDoc +="<head>"; 
     xmlDoc += "</head>"; 

     Document xmlFile = XmlParser.parseXmlString(xmlDoc); 
     Element element = xmlFile.getDocumentElement(); 

Я уже проверил это с NodeType кодом, но когда я создаю родительский узел дает мне == ELEMENT_NODE 1. Я прикрепить этот узел к объекту элемента.

 Element newElement = xmlFile.createElement("parent"); 
     newElement.setAttribute("id", i); 
     element.appendChild(newElement); 

вложит ребенок в родителе, если он уже не ребенок родительского элемента, я проверить это, если это не ребенок, пока я буду создавать новый класс Node и дать это текстовое содержимое.

  Node newChild = xmlFile.createElement("child"); 
      newChild.setTextContent(text); 
      newElement.appendChild(newChild); 

Тогда я сохраню этот файл с помощью трансформатора.

Transformer transformer = null; 
     try { 
      transformer = TransformerFactory.newInstance().newTransformer(); 
     } catch (TransformerConfigurationException | TransformerFactoryConfigurationError e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     DOMSource source = new DOMSource(xmlFile); 
     StreamResult console = new StreamResult(System.out); 
     try { 
      transformer.transform(source, new StreamResult(new FileOutputStream(file.getPath()))); 
     } catch (TransformerException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

Теперь, во второй раз, когда я запускаю программу, я буду разбирать прямо из этого файла. XML-файл, который был создан, имеет структуру, представленную ниже

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<head> 
<parent id="1"> 
<child>text1</child> 
<child>text2</child> 
<child>text3</child> 
</parent> 
<parent id="2"> 
<child>text1</child> 
<child>text2</child> 
</parent> 
</head> 

теперь, когда создается файл, файл будет прочитан затем разобран для создания элемента вместо жесткого закодированной строки.

xmlDoc = this.readFile(file, Charset.forName("UTF-8")); 
Document xmlFile = XmlParser.parseXmlString(xmlDoc); 
Element element = xmlFile.getDocumentElement(); 
... 
String readFile(File file, Charset charset) throws IOException { 
     return new String(Files.readAllBytes(file.toPath()), charset); 

Проблема теперь родительский элемент не может быть отлит как элемент и имеет значение == типа Text_Node 3. Следующий объект не может быть литыми.

Element nextSib = (Element) element.getFirstChild(); 

Идея заключается в том, что теперь я могу добавить соответствующий ребенка к родителю, проходя через каждый родительский узел, который является, почему я должен получить его в виде элемента, так что я могу использовать атрибут ID. Но я не могу этого сделать, поскольку родительский узел почему-то преобразован в текстовый узел.

ответ

1

Поскольку вы используете отступы при выписывании дерева, между узлами элементов будет пустое пространство, поэтому дочерний узел может быть текстовым узлом с пробелом. Если вы ищете первый дочерний узел элемента, используйте XPath *[1] или просто имя элемента foo[1], или если вы хотите сделать это с помощью childNodes, убедитесь, что вы проверяете тип nodeType, пока не найдете узел элемента.

+1

В качестве альтернативы, сериализуйте файл без отступов. –

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