如何删除将Document转换为String时引入的新行?

时间:2010-03-05 08:55:06

标签: java xml

我正在使用代码

将xml字符串转换为nodelist
InputSource inputSource = new InputSource(new ByteArrayInputStream(
    uploadFormBean.getXhtmlResponse().getBytes()));
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
Document document;
document = documentBuilderFactory.newDocumentBuilder().parse(inputSource);

我执行上述操作以迭代节点列表并使用setTextContent替换一个节点元素。

然后我使用以下API将Document转换为字符串

 ByteArrayOutputStream byteOutput = new java.io.ByteArrayOutputStream();
 Result result = new StreamResult(byteOutput); 
 Source source = new DOMSource(document); 
 // write the DOM document to the file 
 Transformer transformer;
 transformer = TransformerFactory.newInstance().newTransformer();
 transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "YES");
 transformer.transform(source, result);
 String resultText = byteOutput.toString();
 System.out.println("resultText::" + resultText);

当我显示字符串时,我发现生成的xml已经引入了新行。

为什么会这样?源xml String没有这些新行。怎么解决这个问题?

当我使用str.replaceAll(“((r | \ n)”,“”);它删除所有新行。我不希望这种情况发生。我想以与输入相同的方式返回String。我正在寻找一种方法来避免在处理过程中引入不必要的新行。

6 个答案:

答案 0 :(得分:0)

transformer.setOutputProperty(OutputKeys.INDENT, "no");可能会有效

答案 1 :(得分:0)

在JDK 1.6中,我粘贴了以下代码,但没有添加任何新行

InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("digest.xml");
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
Document document = documentBuilderFactory.newDocumentBuilder().parse(resourceAsStream);
ByteArrayOutputStream byteOutput = new java.io.ByteArrayOutputStream();
Result result = new StreamResult(byteOutput); 
Source source = new DOMSource(document); 
// write the DOM document to the file 
Transformer transformer;
transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "YES");
transformer.transform(source, result);
String resultText = byteOutput.toString();
System.out.println("resultText::" + resultText);

你在setTextContent做什么吗?或许无意中在该代码中添加新行?

答案 2 :(得分:0)

获得DOM对象后,尝试使用getChildNodes()获取节点列表。然后使用item()遍历所有子节点,获取具有文本内容的每个节点的文本内容,然后将该内容添加到字符串中。这可能比你试图弄清楚变压器对你的文件做了什么更好。

答案 3 :(得分:0)

所以你希望你的整个输出XML在一行吗? 如果是这样,这可能是诀窍:

String separator = System.getProperty("line.separator");  
System.setProperty("line.separator", "");
transformer.transform(source, result);
// Remember to re-set it to it's original value!
System.setProperty("line.separator", separator);

答案 4 :(得分:0)

我可以为您提供FilteredWriter课程:

private class FilteredWriter extends FilterWriter
{
    protected char[] filter = null;

    protected FilteredWriter(Writer out) {
        super(out);
    }

    public void setFilter(String filteredChars) {
        filter = filteredChars.toCharArray();
    }

    public void write(String str, int off, int len) throws IOException
    {
        write(str.toCharArray(), off, len);
    }

    public void write(char[] cbuf, int off, int len) throws IOException
    {
        for (int i = off; i < off + len; i++)
            write(cbuf[i]);
    }

    public void write(int c) throws IOException
    {
        for (char f : filter)
        {
            if (f == (char)c)
                return;
        }
        out.write(c);
    }
}

这是如何使用它:

FilteredWriter filteredWriter = new FilteredWriter(writer);
filteredWriter.setFilter("\r\n\t");
StreamResult result = new StreamResult(filteredWriter);

希望这会有所帮助......

答案 5 :(得分:0)

如果您正在为DOM使用xerces实现,那么在序列化时请确保将indent标志设置为false。

org.apache.xml.serialize.OutputFormat format = 
new org.apache.xml.serialize.OutputFormat(n.getOwnerDocument());
format.setIndenting(true);
format.setPreserveSpace(false);
format.setLineWidth(80);
format.setMethod(Method.XML);

Varun Jangidi