我正在使用代码
将xml字符串转换为nodelistInputSource 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。我正在寻找一种方法来避免在处理过程中引入不必要的新行。
答案 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