【发布时间】:2015-12-08 12:54:31
【问题描述】:
我们在使用 javax.xml.transform.Transformer 缩进 XML 字符串的 Java 应用程序中遇到问题。
问题是它在本地机器上工作正常,但是当部署在远程机器上时,缩进被忽略了。我们在本地和服务器上使用相同的服务器(Wildfly 8.2)和相同的 Java(1.8)。
执行缩进的方法:
public static String transToXMLString(Document doc) {
try {
StreamResult sw = new StreamResult(new StringWriter());
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer;
transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.transform(new DOMSource(doc), sw);
return sw.getWriter().toString();
} catch (TransformerException e) {
e.printStackTrace();
}
return null;
}
本地机器上的结果:
13:45:30,583 INFO [stdout] (default task-6) <?xml version="1.0" encoding="UTF-8" standalone="no"?>
13:45:30,583 INFO [stdout] (default task-6) <workflow URI="">
13:45:30,583 INFO [stdout] (default task-6) <output ID="" URI="#out1"/>
13:45:30,583 INFO [stdout] (default task-6) <input ID="sessionToken" URI="#sessionToken"/>
13:45:30,583 INFO [stdout] (default task-6) <services>
13:45:30,584 INFO [stdout] (default task-6) <sequence>
13:45:30,584 INFO [stdout] (default task-6) <service URI="">
13:45:30,584 INFO [stdout] (default task-6) <input ID="" URI=""/>
13:45:30,584 INFO [stdout] (default task-6) <input URI="" value=""/>
13:45:30,584 INFO [stdout] (default task-6) <output ID="" URI=""/>
13:45:30,584 INFO [stdout] (default task-6) </service>
13:45:30,584 INFO [stdout] (default task-6) </sequence>
13:45:30,584 INFO [stdout] (default task-6) </services>
13:45:30,584 INFO [stdout] (default task-6) </workflow>
13:45:30,584 INFO [stdout] (default task-6)
远程服务器上的结果:
2015-12-08 13:47:36,577 INFO [stdout] (default task-6) Client : close()......
2015-12-08 13:47:36,599 INFO [stdout] (default task-6) <?xml version="1.0" encoding="UTF-8"?><workflow URI="">
2015-12-08 13:47:36,600 INFO [stdout] (default task-6) <output ID="" URI="#out1"/>
2015-12-08 13:47:36,600 INFO [stdout] (default task-6) <input ID="sessionToken" URI="#sessionToken"/>
2015-12-08 13:47:36,602 INFO [stdout] (default task-6) <services>
2015-12-08 13:47:36,605 INFO [stdout] (default task-6) <sequence>
2015-12-08 13:47:36,605 INFO [stdout] (default task-6) <service URI="">
2015-12-08 13:47:36,606 INFO [stdout] (default task-6) <input ID="" URI=""/>
2015-12-08 13:47:36,607 INFO [stdout] (default task-6) <input URI="" value=""/>
2015-12-08 13:47:36,608 INFO [stdout] (default task-6) <output ID="" URI=""/>
2015-12-08 13:47:36,608 INFO [stdout] (default task-6) </service>
2015-12-08 13:47:36,609 INFO [stdout] (default task-6) </sequence>
2015-12-08 13:47:36,609 INFO [stdout] (default task-6) </services>
2015-12-08 13:47:36,610 INFO [stdout] (default task-6) </workflow>
2015-12-08 13:47:36,610 INFO [stdout] (default task-6)
我在网页的 textarea 中显示这个 xml,我需要在那里缩进,我很奇怪它在本地机器上的行为与在远程机器上的行为不同,CSS 是相同的,tje java 版本是相同的。在我看来,Transformes 类在本地服务器上的行为与在远程服务器上的行为不同。
我还尝试将 Transformer 输出写入文件以避免克隆和日志设置的差异。
本地主机上的文件如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<workflow URI="">
<output ID="" URI="#out1"/>
<input ID="sessionToken" URI="#sessionToken"/>
<services>
<sequence>
<service URI="">
<input ID="" URI=""/>
<input URI="" value=""/>
<output ID="" URI=""/>
</service>
</sequence>
</services>
</workflow>
在远程服务器上看起来(所以没有缩进):
<?xml version="1.0" encoding="UTF-8"?><workflow URI="">
<output ID="" URI="#out1"/>
<input ID="sessionToken" URI="#sessionToken"/>
<services>
<sequence>
<service URI="">
<input ID="" URI=""/>
<input URI="" value=""/>
<output ID="" URI=""/>
</service>
</sequence>
</services>
</workflow>
所以对我来说,它看起来像是 Transformer 方法的不同行为......但它怎么可能呢??
【问题讨论】: