2013-06-11 2 views
0

나는 자바에서 일부 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); 
     } 
    } 

} 
+0

질문에 명확하게 답변 할 수 없습니다. mixedContent를 처리하고 들여 쓰기 규칙이 프로세서에 따라 다를 수 있습니다. Saxon과 같은 다른 XSLT 엔진을 사용해 볼 가치가 있습니다. 여기 공백에 대한 또 다른 질문이 있습니다. http://stackoverflow.com/questions/1384802/java-how-to-indent-xml-generated-by-transformer –

+0

@ peter.murray.rust - 예, 그 질문과 나는 매우되었습니다. 좋은 친구 최근 : P 나는 Saxon을 들여다 볼 것이다. –

+0

나는 아마 Saxon을 가장 신뢰할 것이다. 마이크 케이 (Mike Kay)는 사양을 만드는 데 도움을 주었으며 이와 같은 것들에 대해 철저히 조사 할 것입니다. 그리고 그는 아마 당신에게 직접적인 대답을 줄 것입니다. –

답변

1

가, 다음은 XML을 존중해야한다 : 여기에 내가 사용하고 자바 코드는 공간 = "preserve", 들여 쓰기를 억제해야 함). XSLT 2.0 사양은 XSLT 1.0보다이 점에 대해 훨씬 더 명확하며 "필수"항목이 아닌 "반드시"필요하게 만듭니다.

XSLT 변환 대신 JAXP ID 변환을 사용하고 있습니다. JAXP 스펙에서부터 XSLT 1.0 스펙에 대한 참조가 있지만 약간 털이 있습니다.

색슨을 사용하는 경우 원하는 행동을 취해야합니다. Saxon에서는 SUPPRESS_INDENTATION 출력 매개 변수를 사용하여 특정 요소의 들여 쓰기를 억제 할 수 있으므로 직렬화 할 문서에 xml : space를 포함 할 필요조차 없습니다.

+0

+1 공백에 관한 많은 논의가있었습니다. 그리고 1.0 버전에서 일관되게 이해되거나 구현되지 않았다고 의심되는 것으로 나타 났으므로. –