2017-01-08 2 views
2

Я работаю с javax.xml & После удаления какой-то узел:Java XML - после удаления узла - пробел остается - как удалить?

docBuilderFactory = DocumentBuilderFactory.newInstance(); 
docBuilder = docBuilderFactory.newDocumentBuilder(); 
document = docBuilder.parse(new File("file_name")); 
NodeList tagList = document.getElementsByTagName("tag_name"); 
tagList.item(0).getParentNode().removeChild(waysList.item(0)); 

Вместо удаленного тега, у меня есть пустая строка.

Как избежать этого или удалить пустую строку?

XML файл:

<root> 
    <tag_name>text</tag_name> 
    <tag_name>text</tag_name> 
    <tag_name>text</tag_name> 
</root> 

EDIT: Если добавить tagList.item(0).getParentNode().setTextContent(""); до или после removeChild я получаю NullPointerException.

Спасибо,

+2

XML структурирована таким образом, ' текст текст текст' - удаление '' child' листья texttext '- вам нужно, чтобы очистить [содержание текста] (https://docs.oracle.com /javase/7/docs/api/org/w3c/dom/Node.html#setTextContent(java.lang.String)) тоже. –

+2

Предлагаю вам также предоставить содержимое файла. – fabfas

+0

@fabfas Я отредактировал вопрос – michael

ответ

2

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

public static void main(String[] args){ 
    File file=new File(XmlProcessing.class.getResource("InputXml.txt").getFile()); 
    // create a new DocumentBuilderFactory 
     DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
     try{ 
    DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
    Document document = docBuilder.parse(file); 
    System.out.println("Before removing the Node:-"); 
    printDocument(document, System.out); 
    NodeList tagList = document.getElementsByTagName("tag_name"); 
     Element elemToBeRemoved = (Element)tagList.item(0); 
     Node prevElem = elemToBeRemoved.getPreviousSibling(); 
     if (prevElem != null && 
      prevElem .getNodeType() == Node.TEXT_NODE && 
      prevElem .getNodeValue().trim().length() == 0) { 
      elemToBeRemoved.getParentNode().removeChild(prevElem); 
     } 
     elemToBeRemoved.getParentNode().removeChild(elemToBeRemoved); 
     System.out.println("\nAfter removing the node:-"); 
     printDocument(document, System.out); 


     }catch(Exception excep){ 
      excep.printStackTrace(); 
     } 

} 
public static void printDocument(Document doc, OutputStream out) throws IOException, TransformerException { 
    TransformerFactory tf = TransformerFactory.newInstance(); 
    Transformer transformer = tf.newTransformer(); 
    transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); 
    transformer.setOutputProperty(OutputKeys.METHOD, "xml"); 
    transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
    transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 
    transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); 

    transformer.transform(new DOMSource(doc), 
     new StreamResult(new OutputStreamWriter(out, "UTF-8"))); 
} 


/** Output:- 
Before removing the Node:- 
<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<root> 
    <tag_name>text</tag_name> 
    <tag_name>text</tag_name> 
    <tag_name>text</tag_name> 
</root> 

After removing the node:- 
<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<root> 
    <tag_name>text</tag_name> 
    <tag_name>text</tag_name> 
</root> 

*/ 
+1

Привет, спасибо за ответ, но это не сработало для меня – michael

+1

Обновленный полный код и его вывод для вашего реф. –

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