표준 Java API 만있는 javax.xml.transform.Transformer의 예쁜 인쇄 출력 (들여 쓰기 및 문서 유형 위치 지정)
다음과 같은 간단한 코드를 사용합니다.
package test;
import java.io.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
public class TestOutputKeys {
public static void main(String[] args) throws TransformerException {
// Instantiate transformer input
Source xmlInput = new StreamSource(new StringReader(
"<!-- Document comment --><aaa><bbb/><ccc/></aaa>"));
StreamResult xmlOutput = new StreamResult(new StringWriter());
// Configure transformer
Transformer transformer = TransformerFactory.newInstance()
.newTransformer(); // An identity transformer
transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "testing.dtd");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(xmlInput, xmlOutput);
System.out.println(xmlOutput.getWriter().toString());
}
}
출력을 얻습니다.
<?xml version="1.0" encoding="UTF-8"?>
<!-- Document comment --><!DOCTYPE aaa SYSTEM "testing.dtd">
<aaa>
<bbb/>
<ccc/>
</aaa>
질문 A : 문서 주석 뒤에 doctype 태그가 나타납니다. 문서 주석 앞에 표시 할 수 있습니까?
질문 B : JavaSE 5.0 API 만 사용하여 들여 쓰기를 수행하려면 어떻게해야합니까? 이 질문은 본질적으로 Java 에서 xml을 예쁜 인쇄하는 방법 과 동일 하지만 해당 질문의 거의 모든 답변은 외부 라이브러리에 따라 다릅니다. Java의 API 만 사용하는 유일한 적용 가능한 답변 (Lorenzo Boccaccia라는 사용자가 게시 한)은 기본적으로 위에 게시 된 코드와 동일하지만 나에게 적합하지 않습니다 (출력에 표시된 것처럼 들여 쓰기가 없습니다).
외부 라이브러리에 대한 많은 답변처럼 들여 쓰기에 사용할 공백의 양을 설정해야한다고 생각하지만 Java API에서 지정할 위치를 찾을 수 없습니다. 자바 API에 들여 쓰기 속성을 "yes"로 설정할 수있는 가능성이 있다는 사실을 감안할 때, 어떻게 든 들여 쓰기를 수행 할 수 있어야합니다. 방법을 모르겠어요.
결함이있는 물건은 들여 쓰기 정도입니다. 다음과 같이 들여 쓰기 및 들여 쓰기 양을 설정할 수 있습니다.
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
transformer.transform(xmlInput, xmlOutput);
예를 들어 약간의 유틸리티 클래스 ...
import org.apache.xml.serialize.XMLSerializer;
public class XmlUtil {
public static Document file2Document(File file) throws Exception {
if (file == null || !file.exists()) {
throw new IllegalArgumentException("File must exist![" + file == null ? "NULL"
: ("Could not be found: " + file.getAbsolutePath()) + "]");
}
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
dbFactory.setNamespaceAware(true);
return dbFactory.newDocumentBuilder().parse(new FileInputStream(file));
}
public static Document string2Document(String xml) throws Exception {
InputSource src = new InputSource(new StringReader(xml));
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
dbFactory.setNamespaceAware(true);
return dbFactory.newDocumentBuilder().parse(src);
}
public static OutputFormat getPrettyPrintFormat() {
OutputFormat format = new OutputFormat();
format.setLineWidth(120);
format.setIndenting(true);
format.setIndent(2);
format.setEncoding("UTF-8");
return format;
}
public static String document2String(Document doc, OutputFormat format) throws Exception {
StringWriter stringOut = new StringWriter();
XMLSerializer serial = new XMLSerializer(stringOut, format);
serial.serialize(doc);
return stringOut.toString();
}
public static String document2String(Document doc) throws Exception {
return XmlUtil.document2String(doc, XmlUtil.getPrettyPrintFormat());
}
public static void document2File(Document doc, File file) throws Exception {
XmlUtil.document2String(doc, XmlUtil.getPrettyPrintFormat());
}
public static void document2File(Document doc, File file, OutputFormat format) throws Exception {
XMLSerializer serializer = new XMLSerializer(new FileOutputStream(file), format);
serializer.serialize(doc);
}
}
XMLserializer는 Apache Foundation의 xercesImpl에서 제공합니다 . 다음은 maven 종속성입니다.
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.11.0</version>
</dependency>
http://mvnrepository.com/artifact/xerces/xercesImpl/2.11.0 에서 선호하는 빌드 도구에 대한 종속성을 찾을 수 있습니다 .
You could probably prettify everything with an XSLT file. Google throws up a few results, but I can't comment on their correctness.
To make the output a valid XML document, NO. A valid XML document must start with a processing instruction. See the XML specification http://www.w3.org/TR/REC-xml/#sec-prolog-dtd for more details.
ReferenceURL : https://stackoverflow.com/questions/1264849/pretty-printing-output-from-javax-xml-transform-transformer-with-only-standard-j
'Development Tip' 카테고리의 다른 글
오라클 : WHERE 절에서`(+)`는 무엇을합니까? (0) | 2021.01.06 |
---|---|
PHP에서 현재 함수를 실행하는 코드 줄과 파일을 얻습니까? (0) | 2021.01.06 |
정규식 부정 미리보기 (0) | 2021.01.06 |
새 항목이 추가 될 때 ListBox 자동 스크롤을 어떻게 할 수 있습니까? (0) | 2021.01.06 |
C #에서 다차원 배열의 행 / 열 길이를 얻는 방법은 무엇입니까? (0) | 2021.01.05 |