Java 正确打印多行xml节点

Java 正确打印多行xml节点,java,xml,Java,Xml,我有一个Java应用程序,它从一个具有多行文本节点的网站获取xml文件,如下所示: <root> <node>info</node> <mlnode>some multi line text</mlnode> </root> Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSo

我有一个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());
不幸的是,这段代码将我的多行内容放在一行:
somemultilitext
。我想保留换行符。我希望在所有操作系统(主要是windows和linux)上保留换行符

我该怎么做

编辑:此问题与正确缩进无关。这只是关于在节点的内容中保留换行符。保持换行符的位置很重要,因为该节点的内容是配置文件的一部分,必须用换行符分隔。

我不在乎正确的缩进(如果我在乎的话:我知道SO和其他论坛上有足够的资源来解释如何正确缩进)。

正在解析换行符并按原样输出

源XML似乎没有Windows要求的两个行尾字符。我想您必须找到换行符(“\n”)并将其替换为回车符和换行符(“\r\n”)


由于附加的“\r”将在Unix系统上显示为^M,因此您应该检测JVM中的操作系统,确保它是Windows并进行替换。

我发现了错误,但它不在我在问题中发布的代码中。
问题出在获取网站内容(xml文件)并将其转换为字符串的代码中。我使用了以下代码,根据问题改编:

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
    }
}

很抱歉,我没有想到这个问题会出现在另一个类中,因此我没有将该代码添加到我的问题中。

您可以按如下所示更改代码

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());
Document doc=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(新的InputSource(新的StringReader(xml));
NodeList nList=doc.getElementsByTagName(“mlnode”);
节点nNode=nList.item(0);
字符串值=nNode.getTextContent();
StringBuilder stb=新的StringBuilder();
字符串[]strAry=value.split(“\n”);
对于(int k=0;k

这将根据需要打印文本

我的问题不是缩进。它只涉及节点文本中的换行符。我不关心正确的缩进。您的代码对我来说很有用,使用Java 1.7.0_17。它打印保留换行符的文本内容。奇怪。我使用OpenJDK1.7.0_09在Linux上进行了测试。也许这取决于平台?你的操作系统是什么?在Mac OSX 10.7和OpenJDK 1.7.0_04-ea上运行良好。您使用的是第三方DOM解析器吗?我使用的是org.w3c.DOM中的类。