【问题标题】:Print multiline xml node properly正确打印多行 xml 节点
【发布时间】:2013-02-27 09:47:05
【问题描述】:

我有一个 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)上保留换行符。

我该怎么做?

编辑:这个问题不是关于正确缩进的。这只是关于在节点的内容中保留换行符。将换行符保留在原处很重要,因为该节点的内容是配置文件的一部分,必须用换行符分隔。
我不关心正确的缩进(如果我这样做了:我知道在 SO 和其他论坛上有足够的资源来解释如何正确缩进)。

【问题讨论】:

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

标签: java xml


【解决方案1】:

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

您的源 XML 似乎没有 Windows 需要的两个行尾字符。我猜你必须找到换行符(“\n”)并用回车和换行符(“\r\n”)替换它们。

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

【讨论】:

    【解决方案2】:

    我发现了错误,它不在我在问题中发布的代码中。
    问题出在获取网站内容的代码中,这是一个 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
        }
    }
    

    抱歉,我没有想到其他班级的问题,所以我没有在我的问题中添加该代码。

    【讨论】:

      【解决方案3】:

      您可以按如下方式更改代码

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

      这应该根据需要打印文本

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 2014-11-01
        • 2018-05-31
        • 1970-01-01
        相关资源
        最近更新 更多