2016-06-03 3 views
0

Я анализирую XML-файл, чтобы изменить возможно все значения и сохранить. Но после сохранения изменений нет. Что я делаю неправильно или что я могу сделать лучше?Отредактированный XML-контент не изменяется после сохранения в файл

Моя цель - проанализировать все содержимое в файле XML, проверить все строки, содержащие специальные символы, и заменить их на escape-символы. Пожалуйста, не спрашивайте, почему парсер, получающий XML-документ, не относится к этим символам, поэтому мне не остается выбора, кроме как избежать их.

String xmlfile = FileUtils.readFileToString(new File(filepath)); 


     DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
     Document doc = docBuilder.parse(new InputSource(new StringReader(xmlfile))); 

     NodeList nodeList = doc.getElementsByTagName("*"); 

     for (int i = 0; i < nodeList.getLength(); i++) 
     {   
      Node currentNode = nodeList.item(i); 

      if (currentNode.getNodeType() == Node.ELEMENT_NODE) 
      {    
      if (currentNode.getFirstChild()==null) 
        {} 
       else {currentNode.setNodeValue(StringEscapeUtils.escapeXml(currentNode.getFirstChild().getNodeValue())); } 
      } 
     } 


     TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
     javax.xml.transform.Transformer transformer = transformerFactory.newTransformer(); 
     DOMSource source = new DOMSource(doc); 

     StringWriter writer = new StringWriter(); 
     StreamResult result = new StreamResult(writer); 
     transformer.transform(source, result); 


     FileOutputStream fop = null; 
     File file; 

     file = File.createTempFile("escapedXML"+UUID.randomUUID(), ".xml"); 

     fop = new FileOutputStream(file); 

     String xmlString = writer.toString(); 
     byte[] contentInBytes = xmlString.getBytes(); 

     fop.write(contentInBytes); 
     fop.flush(); 
     fop.close(); 

ответ

2

Вы обновляете узел Element и эта операция не действует. Кроме того, я думаю, что следующее более надежное, так как оно будет проходить через все текстовые узлы, а не только первое.

for (int i = 0; i < nodeList.getLength(); i++) { 
    Node currentNode = nodeList.item(i); 
    if (currentNode.getNodeType() == Node.ELEMENT_NODE) { 
     Node child = currentNode.getFirstChild(); 
     while(child != null) { 
      if (child.getNodeType() == Node.TEXT_NODE) { 
       child.setTextContent(StringEscapeUtils.escapeXml(child.getNodeValue())); 
      } 
      child = child.getNextSibling(); 
     } 
    } 
} 
+0

Спасибо за ваш надежный подход, воспользуетесь им. Как я смогу сделать, чтобы эти изменения отражались на объекте doc? – Undisputed007

+0

Используйте мой пример кода :) –

+0

child.setTextContent дает ошибку, потому что setTextContent не является методом узла :( – Undisputed007

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