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)
이 xml을 웹 페이지의 텍스트 영역에 표시하고 있는데 들여 쓰기가 필요합니다. 로컬 컴퓨터에서 원격과 다르게 동작하고 CSS가 동일하고 자바 버전이 동일하다는 점이 이상합니다. Transformes 클래스가 원격 서버와 로컬에서 다르게 작동하는 것으로 보입니다.
또한 clonsole 및 로그 설정의 차이를 피하기 위해 Transformer 출력을 파일에 작성하려고했습니다.
localhost의 파일은 다음과 같습니다.
<?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 메서드의 다른 동작처럼 보이지만 어떻게 될 수 있습니까 ??
XML 형식을 지정하기 위해 DOM4J를 선택했으며 로컬 및 원격 모두 동일하게 작동합니다. 내 스니 플릿은 다음과 같습니다.
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();
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다