2011-08-03 10 views
5

Tôi sử dụng JDom để phân tích cú pháp/định dạng XML. Tôi muốn các dòng thuộc tính dài được chia thành nhiều dòng.Định dạng XML, một thuộc tính trên mỗi dòng, với JDom

Giống như:

<node att1="Foo" att2="Bar" att3="Foo" /> 

Into:

<node 
    att1="Foo" 
    att2="Bar" 
    att3="Foo" /> 

Theo JDom FAQ, JDOM thể được chuyển thành DOM và SAX kiện tiêu chuẩn. Vì vậy, bất kỳ trình kết xuất nào hỗ trợ SAX hoặc DOM và có khả năng hiển thị đẹp như vậy sẽ rất tuyệt vời.

Xin cảm ơn trước.

Trả lời

4

Ok, tôi không tìm thấy bất kỳ lớp nào đã làm điều đó. Vì vậy, tôi thực hiện một bản thân mình như là một lớp con của org.jdom.output.XMLOutputter

import java.io.IOException; 
import java.io.Writer; 
import java.util.*; 

import org.jdom.Attribute; 
import org.jdom.Element; 
import org.jdom.output.XMLOutputter; 


/** This outputter prints each attributes in a new line */ 
public class OneAttributePerLineOutputter extends XMLOutputter { 

    // ---------------------------------------------------- 
    // Attribute 
    // ---------------------------------------------------- 

    /** Limit wrapping attribute for one namespace */ 
    String namespace = null; 

    /** Number of inline attributes before wrapping */ 
    private int nbInlineAttribs; 

    // ---------------------------------------------------- 
    // Constructor 
    // ---------------------------------------------------- 

    /** 
    * @param namespace Limit wrapping attributes to one namespace. If null, all attributes are concerned 
    * @param nbInlineAttribs Allow a given number of inline elements before wrapping to several lines 
    */ 
    public OneAttributePerLineOutputter(
      String namespace, 
      int nbInlineAttribs) 
    { 
     this.namespace = namespace; 
     this.nbInlineAttribs = nbInlineAttribs; 
    } 

    // ---------------------------------------------------- 
    // Helpers 
    // ---------------------------------------------------- 

    static private int elementDepth(Element element) { 
     int result = 0; 
     while(element != null) { 
      result++; 
      element = element.getParentElement(); 
     } 
     return result; 
    } 

    // ---------------------------------------------------- 
    // Overridden methods 
    // ---------------------------------------------------- 

    @Override protected void printAttributes(
      Writer writer, 
      List attribs, 
      Element parent, 
      NamespaceStack ns) throws IOException 
    {  
        // Loop on attributes 
      for (Object attribObj : attribs) { 

       Attribute attrib = (Attribute) attribObj; 

       // Check namespace 
       if ((this.namespace == null) || 
        (this.namespace.equals(attrib.getNamespaceURI()))) 
       { 
        // Reached max number of inline attribs ? 
        if (attribs.size() > this.nbInlineAttribs) { 

         // New line 
         writer.append("\n"); 

         // Indent 
         for (int i=0; i < elementDepth(parent); i++) { 
          writer.append(this.getFormat().getIndent()); 
         } 
        } 
       } 

       // Output single atribute 
       List list = new ArrayList<Object>(); 
       list.add(attrib); 
       super.printAttributes(writer, list, parent, ns); 
      } 
    } 
} 

serializer này sẽ tuân theo chính sách thụt lề của Format nhất định.

Nó cho phép áp dụng thuộc tính gói vào một không gian tên duy nhất (tôi cần tính năng đó) và bạn có thể chỉ định số lượng nội tuyến tối đa bạn cho phép trước khi kết thúc chúng.

Tôi hy vọng điều này có thể hữu ích cho ai đó.

+0

+1, viết đầu ra riêng là cách tôi chọn. Và tìm thấy JDom một chút, nói rằng, cần tái cấu trúc. Nếu bạn có thời gian, bạn có thể đóng góp cho nó - yêu cầu tư nhân commiter trên SF. –