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 đó.
Nguồn
2011-08-05 13:38:13
+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. –