gpt4 book ai didi

Java 1.6 : javax. xml.transform.Transformer 拒绝缩进包含换行符的 xml 字符串

转载 作者:行者123 更新时间:2023-11-30 11:52:17 27 4
gpt4 key购买 nike

我需要能够使用 Java API 漂亮地打印 xml 字符串,并且已经在 Web 和这个特定网站上找到了多种解决方案。然而,尽管多次尝试让它与 javax.xml.transform.Transformer 一起工作,但到目前为止它一直是失败的。当参数中的 xml 字符串不包含 xml 元素之间的任何换行符时,我在下面提供的代码仅部分起作用。这是行不通的。我需要能够漂亮地打印任何东西,假设它是格式正确且有效的 xml,甚至是以前 pretty-print 的字符串。

我得到了这个(根据我发现的代码片段放在一起,人们声称它对他们有用):

import java.io.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;

public class XMLFormatter {

public static String format(String xml, int indent, boolean omitXmlDeclaration)
throws TransformerException {

if (indent < 0) {
throw new IllegalArgumentException();
}
String ret = null;
StringReader reader = new StringReader(xml);
StringWriter writer = new StringWriter();
try {
TransformerFactory factory = TransformerFactory.newInstance();
factory.setAttribute("indent-number", new Integer(indent));
Transformer transformer = factory.newTransformer();
if (omitXmlDeclaration) {
transformer.setOutputProperty(
OutputKeys.OMIT_XML_DECLARATION, "yes");
}
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(
"{http://xml.apache.org/xslt}indent-amount",
String.valueOf(indent));
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.transform(
new StreamSource(reader),
new StreamResult(writer));
ret = writer.toString();
} catch (TransformerException ex) {
throw ex;
} finally {
if (reader != null) {
reader.close();
}
try {
if (writer != null) {
writer.close();
}
} catch (IOException ex) {}
}

return ret;
}

public static void main(String[] args) throws TransformerException {
StringBuilder sb = new StringBuilder();
sb.append("<rpc-reply><data><smth/></data></rpc-reply>");

System.out.println(sb.toString());
System.out.println();
System.out.println(XMLFormatter.format(sb.toString(), 4, false));

final String NEWLINE = System.getProperty("line.separator");
sb.setLength(0);
sb.append("<rpc-reply>");sb.append(NEWLINE);
sb.append("<data>");sb.append(NEWLINE);
sb.append("<smth/>");sb.append(NEWLINE);
sb.append("</data>");sb.append(NEWLINE);
sb.append("</rpc-reply>");

System.out.println(sb.toString());
System.out.println();
System.out.println(XMLFormatter.format(sb.toString(), 4, false));
}
}

这段代码不应该被那些换行符打扰,不是吗?这是一个错误还是我在这里遗漏了一些重要的东西?代码片段的输出:

<rpc-reply><data><smth/></data></rpc-reply>

<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply>
<data>
<smth/>
</data>
</rpc-reply>

<rpc-reply>
<data>
<smth/>
</data>
</rpc-reply>

<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply>
<data>
<smth/>
</data>
</rpc-reply>

据我所知,我的代码与其他示例的唯一区别在于我将 StringWriter 和 StringReader 用于 transform(in, out) 方法。我已经尝试将 xml 转换为 ByteArrayOutputStream,甚至用 DOM 解析它,然后将它提供给转换器,但结果是一样的。我真的很想知道为什么这只适用于单行字符串。

我正在结合使用 jdk1.6_u24 和 Netbeans 6.9.1。

这个问题与(并且可能与许多其他问题)相关,但与以下内容不同:

How to pretty print XML from Java?

indent XML text with Transformer

Indent XML made with Transformer

最佳答案

我得出结论,这是 Transformer 的正常行为。更。它的缩进功能并不意味着可以用作 pretty-print ,无论如何也不能单独使用。当 XML 被漂亮地打印出来时,它的结构会发生变化,除非您确切地知道文档应该是什么样子(基于它的 XSD、DTD 或类似的东西)。这是确定哪些换行符被视为可忽略空白以及哪些是实际元素值或其中一部分的唯一方法。 Transformer 不会重新格式化现有的空格,这就是为什么我的代码输出是这样的。

因此,如果您想使用 Transformer 或任何其他类来漂亮地打印一个已经漂亮地打印过的 XML 字符串,您首先必须摆脱可忽略的空格,而安全地做到这一点的唯一方法是了解您的 XML 文档的结构应该是这样的我希望有人为我确认此声明,因为这目前只是我的假设。如果这个陈述是正确的;第三方 pretty-print 是如何做到的?我知道 JTidy 不需要 XSD,但无论如何打印得很好。除非包含在文本 XML 节点中,否则它是否只是将所有空白视为可忽略的空白?是否有其他方法来确定和消除可忽略的空格?

关于Java 1.6 : javax. xml.transform.Transformer 拒绝缩进包含换行符的 xml 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6941826/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com