在Java中从XML中删除空格和换行符

Jan*_*nou 13 java xml newline strip cdata

使用Java,我想采用以下格式的文档:

<tag1>
 <tag2>
    <![CDATA[  Some data ]]>
 </tag2>
</tag1>
Run Code Online (Sandbox Code Playgroud)

并将其转换为:

<tag1><tag2><![CDATA[  Some data ]]></tag2></tag1>
Run Code Online (Sandbox Code Playgroud)

我试过以下内容,但它并没有给我我期待的结果:

DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
dbfac.setIgnoringElementContentWhitespace(true);
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
Document doc = docBuilder.parse(new FileInputStream("/tmp/test.xml"));

Writer out = new StringWriter();
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.setOutputProperty(OutputKeys.INDENT, "no");
tf.transform(new DOMSource(doc), new StreamResult(out));
System.out.println(out.toString());
Run Code Online (Sandbox Code Playgroud)

Wol*_*ang 19

工作解决方案遵循@Luiggi Mendoza的问题评论中的说明.

public static String trim(String input) {
    BufferedReader reader = new BufferedReader(new StringReader(input));
    StringBuffer result = new StringBuffer();
    try {
        String line;
        while ( (line = reader.readLine() ) != null)
            result.append(line.trim());
        return result.toString();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您应该在使用后使用 **finally** 或 Java 8 [try-with-resources](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) 关闭 BufferedReader。 (3认同)

jta*_*orn 13

递归遍历文档.删除任何包含空白内容的文本节点.修剪具有非空白内容的任何文本节点.

public static void trimWhitespace(Node node)
{
    NodeList children = node.getChildNodes();
    for(int i = 0; i < children.getLength(); ++i) {
        Node child = children.item(i);
        if(child.getNodeType() == Node.TEXT_NODE) {
            child.setTextContent(child.getTextContent().trim());
        }
        trimWhitespace(child);
    }
}
Run Code Online (Sandbox Code Playgroud)


stm*_*ius 5

正如在另一个问题的答案中所记录的那样,相关的函数将是DocumentBuilderFactory.setIgnoringElementContentWhitespace(),但是 - 正如这里已经指出的那样 - 该函数需要使用验证解析器,这需要XML模式或其他类型.

因此,最好的办法是遍历从解析器获得的Document,并删除所有TEXT_NODE类型的节点(或那些只包含空格的TEXT_NODE).