자바 : Transformer에서 생성 한 XML 들여 쓰기 방법
Java의 내장 XML 변환기를 사용하여 DOM 문서를 가져와 결과 XML을 인쇄하고 있습니다. 문제는 "indent"매개 변수를 명시 적으로 설정 했음에도 불구하고 텍스트를 전혀 들여 쓰지 않는다는 것입니다.
샘플 코드
public class TestXML {
public static void main(String args[]) throws Exception {
ByteArrayOutputStream s;
Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Transformer t = TransformerFactory.newInstance().newTransformer();
Element a,b;
a = d.createElement("a");
b = d.createElement("b");
a.appendChild(b);
d.appendChild(a);
t.setParameter(OutputKeys.INDENT, "yes");
s = new ByteArrayOutputStream();
t.transform(new DOMSource(d),new StreamResult(s));
System.out.println(new String(s.toByteArray()));
}
}
결과
<?xml version="1.0" encoding="UTF-8" standalone="no"?><a><b/></a>
원하는 결과
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<a>
<b/>
</a>
생각?
'INDENT'를 활성화하고 변환기의 들여 쓰기 양을 설정해야합니다.
t.setOutputProperty(OutputKeys.INDENT, "yes");
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
최신 정보:
참조 : 직렬화 전에 DOM에서 공백 전용 텍스트 노드를 제거하는 방법은 무엇입니까?
(모든 회원 특히 @ marc-novakowski, @ james-murty 및 @saad에게 감사드립니다) :
제안 된 솔루션 중 어느 것도 나를 위해 일하지 않았습니다. 그래서 나는 앞서 언급 한 두 가지와 세 번째 단계의 혼합이 된 대체 솔루션을 계속 찾았습니다.
- 트랜스포머 팩토리에 들여 쓰기 번호 설정
- 변압기에서 들여 쓰기 활성화
- otuputstream을 writer (또는 bufferedwriter)로 래핑
//(1)
TransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute("indent-number", new Integer(2));
//(2)
Transformer t = tf.newTransformer();
t.setOutputProperty(OutputKeys.INDENT, "yes");
//(3)
t.transform(new DOMSource(doc),
new StreamResult(new OutputStreamWriter(out, "utf-8"));
xml 처리 코드의 "버그"동작을 해결하려면 (3)을 수행해야합니다.
출처 : johnnymac75 @ http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6296446
(제 출처를 잘못 인용 한 경우 알려주세요)
다음 코드는 Java 7에서 저에게 효과적입니다. 트랜스포머 (트랜스포머 팩토리가 아님)에 들여 쓰기 (예)와 들여 쓰기 양 (2)을 설정하여 작동하도록했습니다.
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
t.setOutputProperty(OutputKeys.INDENT, "yes");
t.transform(source, result);
속성을 설정하는 @mabac의 솔루션이 저에게는 효과가 없었지만 @lapo의 의견은 도움이되었습니다.
import com.sun.org.apache.xml.internal.serializer.OutputPropertiesFactory
transformer.setOutputProperty(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "2");
들여 쓰기를 원하면 TransformerFactory.
TransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute("indent-number", new Integer(2));
Transformer t = tf.newTransformer();
I used the Xerces (Apache) library instead of messing with Transformer. Once you add the library add the code below.
OutputFormat format = new OutputFormat(document);
format.setLineWidth(65);
format.setIndenting(true);
format.setIndent(2);
Writer outxml = new FileWriter(new File("out.xml"));
XMLSerializer serializer = new XMLSerializer(outxml, format);
serializer.serialize(document);
For me adding DOCTYPE_PUBLIC worked:
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,"yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "10");
참고URL : https://stackoverflow.com/questions/1384802/java-how-to-indent-xml-generated-by-transformer
'IT박스' 카테고리의 다른 글
| DataGridView 컨트롤의 열 크기를 자동으로 조정하고 사용자가 동일한 그리드의 열 크기를 조정할 수 있도록하는 방법은 무엇입니까? (0) | 2020.08.11 |
|---|---|
| Cin 버퍼를 어떻게 플러시합니까? (0) | 2020.08.11 |
| Swing GUI에서 validate (), revalidate () 및 invalidate ()의 차이점 (0) | 2020.08.10 |
| Entity Framework 코드 우선-Fluent Api 대 데이터 주석의 장단점 (0) | 2020.08.10 |
| 아주 아주 아주 큰 사업부 (0) | 2020.08.10 |