【问题标题】:XML not indented on remote server via Java TransformerXML 未通过 Java Transformer 在远程服务器上缩进
【发布时间】: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 方法的不同行为......但它怎么可能呢??

【问题讨论】:

    标签: java xml xslt


    【解决方案1】:

    问题不在于 XSLT,而在于您的记录器的配置。远程机器正在修剪每一行;本地机器不是。要么调整服务器的配置文件以匹配本地机器,要么将transToXMLString()的结果直接写入文件而不是通过记录器。

    【讨论】:

    • 正如我对上一个答案的评论,我需要缩进,因为我必须在网页的文本区域中显示这个 xml,输出到 syslog 只是尝试查看输出是否有缩进,我会尝试你的挖掘并将输出写入文件,但主要问题是在文本区域中的网页上不存在缩进。
    【解决方案2】:

    对于 XML,不需要缩进。它只能包含一个包含所有数据的字符串。所以没关系。可能是一些环境设置不允许终端缩进

    【讨论】:

    • 嗯,实际上我正在显示这个 xml,然后也在网页的文本区域中显示,并且还有没有缩进
    【解决方案3】:

    我选择了 DOM4J 来格式化 xml,它在本地和远程都一样。这是我的片段:

    public static String prettyPrintXml(String xml) {
    
            final StringWriter sw;
    
            try {
                final OutputFormat format = OutputFormat.createPrettyPrint();
                format.setSuppressDeclaration(true);
                final org.dom4j.Document document = DocumentHelper.parseText(xml);
                sw = new StringWriter();
                final XMLWriter writer = new XMLWriter(sw, format);
                writer.write(document);
            } catch (Exception e) {
                throw new RuntimeException("Error pretty printing xml:\n" + xml, e);
            }
            return sw.toString();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      相关资源
      最近更新 更多