Java 正确打印多行xml节点
我有一个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
<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中的类。