2013-06-23 28 views
5

Tôi đang cố gắng tìm cách định dạng xml sao cho mỗi thuộc tính sẽ nằm trong một dòng mới.Jaxb - Marshall - Làm thế nào tôi có thể định dạng các thuộc tính xml - Ví dụ, đặt ngắt dòng sau mỗi thuộc tính

mã:

 OutputFormat of = new OutputFormat(); 
     of.setIndent(4); 
     XMLSerializer serializer = new XMLSerializer(of); 
     Writer stringWriter = new StringWriter(); 
     serializer.setOutputCharStream(stringWriter); 

     marshaller.marshal(target, serializer.asContentHandler()); 
     results = stringWriter.toString(); 

Tôi đang cố gắng để có được điều này:

<blablabla isGood="false" newInstance="false" id="cse_a" 
    deleted="false" name="cse_a" 
    xmlns:blabla="http://www.blabla.com"> 

    <Description><![CDATA[]]></Description> 
    <Name><![CDATA[A]]></Name> 

</blablabla> 

Để trông như thế này:

<blablabla isGood="false" 
      newInstance="false" 
      id="cse_a" 
      deleted="false" 
      name="cse_a" 
      xmlns:blabla="http://www.blabla.com"> 

    <Description><![CDATA[]]></Description> 
    <DisplayName><![CDATA[A]]></DisplayName> 

</blablabla> 

cảm ơn!

+0

(http://stackoverflow.com/questions/1823979/how-to-have-line-breaks-in-xml-attributes?rq=1) – Damo

+0

Đây không phải là những gì tôi đã hỏi ... Tôi cần các thuộc tính được bao bọc, chứ không phải giá trị của chúng. Nhìn vào ví dụ. –

+0

Xin chào David Fischer, Bạn có thể giải quyết vấn đề này không? – neni

Trả lời

0

Một hơi muộn, nhưng tôi đã tìm thấy một giải pháp sử dụng một xml formatter nguồn mở được gọi là "DecentXML". Cần một vài thay đổi, nhưng tất cả trong một công cụ tuyệt vời.

cảm ơn tất cả mọi người.

1

Hành vi này không được cung cấp bởi API JAXB (JSR-222) chuẩn. Vì điều này chỉ dành cho mục đích thẩm mỹ, tôi sẽ đề nghị rằng nó không phải là giá trị bận tâm để đạt được nó.

Nếu đó là điều bạn thực sự phải có, bạn có thể cung cấp triển khai ContentHandler. A ContentHandler sẽ nhận tất cả các sự kiện XML và sau đó bạn có thể kiểm soát cách chúng được ghi vào một số cơ bản OutputStream hoặc Writer. Bạn sẽ cần phải xử lý tất cả các định dạng logic, nhưng khi bạn soái với điều này ContentHandler bạn sẽ nhận được định dạng chính xác mà bạn đang tìm kiếm.

+0

Nếu có thể, bạn có thể chia sẻ một số ví dụ về điều này không? – neni

2

Chỉ cần một ví dụ về Blaise Doughan câu trả lời, với ContentHandler:

import java.io.IOException; 
import java.io.Writer; 

import org.apache.commons.lang3.StringUtils; 
import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

public class WriteOutContentHandler extends DefaultHandler 
{ 

    private static final String NEWLINE = System.getProperty("line.separator"); 
    private static final String INDENT = " "; 

    private Writer _writer; 
    private int depth = 0; 

    public WriteOutContentHandler(Writer writer) 
    { 
     _writer = writer; 
    } 

    @Override 
    public void characters(char[] ch, int start, int length) 
      throws SAXException 
    { 
     try 
     { 
      _writer.write(ch, start, length); 
     } catch (IOException e) 
     { 
      throw new SAXException("Error writing out character content", e); 
     } 
    } 

    @Override 
    public void ignorableWhitespace(char[] ch, int start, int length) 
      throws SAXException 
    { 
     try 
     { 
      _writer.write(ch, start, length); 
     } catch (IOException e) 
     { 
      throw new SAXException("Error writing out character content", e); 
     } 
    } 

    @Override 
    public void endDocument() throws SAXException 
    { 
     try 
     { 
      _writer.flush(); 
     } catch (IOException e) 
     { 
      throw new SAXException("Error flushing character output", e); 
     } 
    } 

    @Override 
    public String toString() 
    { 
     return _writer.toString(); 
    } 

    @Override 
    public void startElement(String uri, String localName, String qName, 
      Attributes attrs) throws SAXException 
    { 
     write(NEWLINE); 
     write(StringUtils.repeat(INDENT, depth)); 
     depth++; 

     String eName = localName; 

     if ("".equals(eName)) 
     { 
      eName = qName; 
     } 

     write("<" + eName); 

     if (attrs != null) 
     { 
      for (int i = 0; i < attrs.getLength(); i++) 
      { 
       String attrName = attrs.getLocalName(i); 

       if ("".equals(attrName)) 
       { 
        attrName = attrs.getQName(i); 
       } 

       write(NEWLINE); 
       write(StringUtils.repeat(INDENT, depth)); 
       write(attrName); 

       write("=\""); 
       write(attrs.getValue(i)); 
       write("\""); 
      } 
     } 

     if (attrs.getLength() > 0) 
     { 
      write(NEWLINE); 
      write(StringUtils.repeat(INDENT, depth-1)); 
     } 

     write(">"); 
    } 

    @Override 
    public void endElement(String namespaceURI, String sName, String qName) throws SAXException 
    { 
     write(NEWLINE); 
     depth--; 
     write(StringUtils.repeat(INDENT, depth)); 

     String eName = sName; 
     if ("".equals(eName)) 
     { 
      eName = qName; 
     } 
     write("</" + eName + ">"); 
    } 

    private void write(String s) throws SAXException 
    { 
     try 
     { 
      _writer.write(s); 
      _writer.flush(); 
     } catch (IOException e) 
     { 
      throw new SAXException("I/O error", e); 
     } 
    } 
} 

Và sử dụng:

StringWriter writer = new StringWriter(); 
    JAXBContext jc = JAXBContext.newInstance(MODEL); 
    Marshaller marshaller = jc.createMarshaller(); 
    marshaller.marshal(node, new WriteOutContentHandler(writer)); 

    return writer.toString();