我有一个Java应用程序从具有多行文本节点的网站获取xml文件,如下所示:
<root>
<node>info</node>
<mlnode>some
multi
line
text</mlnode>
</root>
我的代码目前看起来像这样:
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(xml)));
NodeList nList = doc.getElementsByTagName("mlnode");
Node nNode = nList.item(0);
System.out.println(nNode.getTextContent());
可悲的是,此代码将我的多行内容放在一行:somemultilinetext
。我想保留换行符。我希望在所有操作系统(主要是Windows和Linux)上保留换行符。
我该怎么做?
编辑:关于正确缩进的问题 NOT 。它只是将断行符保留在节点的内容中。将换行符保持原样非常重要,因为该节点的内容是配置文件的一部分,必须用换行符分隔。
我不关心正确的缩进(如果我这样做:我知道在SO和其他论坛上有足够的资源来解释如何正确缩进)。
答案 0 :(得分:0)
正在解析换行符并按原样输出。
您的源XML似乎没有Windows所需的两个行尾字符。我想你必须找到换行符(“\ n”)并用回车符和换行符(“\ r \ n”)替换它们。
由于附加的“\ r”将在Unix系统上显示为^ M,您应该检测JVM中的操作系统,确保它是Windows并进行替换。
答案 1 :(得分:0)
我发现了错误,而且不在我在问题中发布的代码中 问题出在获取网站内容的代码中,该网站是一个xml文件,并将其转换为字符串。我使用了以下代码,改编自this问题:
URL url;
InputStream is = null;
DataInputStream dis;
String line;
String content
try {
url = new URL("https://stackoverflow.com/");
is = url.openStream(); // throws an IOException
dis = new DataInputStream(new BufferedInputStream(is));
while ((line = dis.readLine()) != null) {
content += line; // I forgot to add the linebreak here!
// I added "content += System.getProperty("line.separator");" and it solved my problem
}
} catch (MalformedURLException mue) {
mue.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
try {
is.close();
} catch (IOException ioe) {
// nothing to see here
}
}
抱歉,我没有想到其他课程中出现的问题,所以我没有在我的问题中添加该代码。
答案 2 :(得分:0)
您可以按照以下
更改代码Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(xml)));
NodeList nList = doc.getElementsByTagName("mlnode");
Node nNode = nList.item(0);
String value = nNode.getTextContent();
StringBuilder stb = new StringBuilder();
String [] strAry = value.split("\n");
for(int k = 0; k < strAry.length; k++){
stb.append(strAry[k]);
stb.append(System.getProperty("line.separator"));
}
System.out.println(stb.toString());
这应该根据需要打印文本