正确打印多行xml节点

时间:2013-03-12 01:32:15

标签: java xml

我有一个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和其他论坛上有足够的资源来解释如何正确缩进)。

3 个答案:

答案 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());

这应该根据需要打印文本