나는 자바에서 일부 XML 들여 쓰기/미용 해요 : 나는 XML을 아름답게 때`xml : space = "preserve"를 존중하여 Java에서 XML을 들여 쓰기해야합니까?
<div xml:space="default"><h1 xml:space="default">Indenting mixed content in Java</h1><p xml:space="preserve">Why does indenting mixed content (like this paragraph) add whitespace around <a href="http://www.stackoverflow.com" xml:space="preserve"><strong>this strong element</strong></a>?</p></div>
, 나는 공백 <a>
요소의 내용에 추가하지 않으을, 그래서 나는 변압기를 기대 xml:space="preserve"
을 지정한 그 안의 공백을 보존한다. <a>
과 <strong>
요소 사이에 여분의 공백으로 ...
<div>
<h1 xml:space="default">Indenting mixed content in Java</h1>
<p>Why does indenting mixed content (like this paragraph) add whitespace around <a href="http://www.stackoverflow.com">
<strong xml:space="preserve">this strong element</strong>
</a>?</p>
</div>
: 나는 XML을 변환 할 때
그러나,이 얻을. (그뿐 아니라 </a>
닫기 태그가 열려있는 태그와 어색하게 일치하지 않습니다.)
어떻게 그 공백을 추가하지 못하게 할 수 있습니까? 내가 뭔가 잘못하고 있는거야? (즉, XML의 범위 내이며, 공간 : 당신은 XSLT 1.0 XSLT 2.0 사양을 준수하는 시리얼 라이저를 사용하는 경우
import org.w3c.dom.Element;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import java.io.ByteArrayInputStream;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import java.io.StringWriter;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.stream.StreamResult;
public class XmlExample {
public static void main(String[] argv) {
Document xmlDoc = parseXml("<div xml:space=\"default\">" +
"<h1 xml:space=\"default\">Indenting mixed content in Java</h1>" +
"<p xml:space=\"preserve\">Why does indenting mixed content (like this paragraph) add whitespace around " +
"<a href=\"http://www.stackoverflow.com\" xml:space=\"preserve\"><strong>this strong element</strong></a>?" +
"</p>" +
"</div>");
String xmlString = xmlToString(xmlDoc.getDocumentElement());
System.out.println(xmlString);
}
public static Document parseXml(String xml) {
try {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
docFactory.setNamespaceAware(true);
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(new ByteArrayInputStream(xml.getBytes("UTF-8")));
return doc;
}
catch(Exception e) {
throw new RuntimeException(e);
}
}
public static String xmlToString(Element el) {
try {
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
StringWriter writer = new StringWriter();
DOMSource source = new DOMSource(el);
transformer.transform(source, new StreamResult(writer));
return writer.getBuffer().toString().trim();
}
catch(Exception e) {
throw new RuntimeException(e);
}
}
}
질문에 명확하게 답변 할 수 없습니다. mixedContent를 처리하고 들여 쓰기 규칙이 프로세서에 따라 다를 수 있습니다. Saxon과 같은 다른 XSLT 엔진을 사용해 볼 가치가 있습니다. 여기 공백에 대한 또 다른 질문이 있습니다. http://stackoverflow.com/questions/1384802/java-how-to-indent-xml-generated-by-transformer –
@ peter.murray.rust - 예, 그 질문과 나는 매우되었습니다. 좋은 친구 최근 : P 나는 Saxon을 들여다 볼 것이다. –
나는 아마 Saxon을 가장 신뢰할 것이다. 마이크 케이 (Mike Kay)는 사양을 만드는 데 도움을 주었으며 이와 같은 것들에 대해 철저히 조사 할 것입니다. 그리고 그는 아마 당신에게 직접적인 대답을 줄 것입니다. –