首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XML未通过Java转换器缩进远程服务器

XML未通过Java转换器缩进远程服务器
EN

Stack Overflow用户
提问于 2015-12-08 12:54:31
回答 3查看 71关注 0票数 2

在使用javax.xml.transform.Transformer缩进XML的Java应用程序中,有一个问题。

问题是它在本地机器上工作正常,但是当部署在远程机器上时,缩进就被忽略了。我们在本地和服务器上使用相同的服务器(Wildflie8.2)和相同的Java(1.8)。

执行缩进的方法:

代码语言:javascript
复制
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;
    }

在本地机器上的结果:

代码语言:javascript
复制
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) 

远程服务器上的结果:

代码语言:javascript
复制
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类在本地服务器上的行为与在远程服务器上不同。

我还尝试过将转换器输出写到文件中,以避免在克隆鞋底和日志设置上的差异。

本地主机上的文件如下所示:

代码语言:javascript
复制
<?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>

并且在远程服务器上看起来(因此有了缩进):

代码语言:javascript
复制
<?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>

所以在我看来,变压器方法的不同行为.但怎么可能呢??

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-22 13:58:31

我选择了DOM4J格式,它的工作方式是相同的,无论是本地还是远程。这是我的狙击:

代码语言:javascript
复制
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();
    }
票数 0
EN

Stack Overflow用户

发布于 2015-12-09 04:07:00

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

票数 1
EN

Stack Overflow用户

发布于 2015-12-08 12:59:47

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34156442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档