如何使用dom4j在XML文件的属性之间建立换行符?

时间:2018-08-13 10:01:32

标签: java xml dom4j

我想通过使用java生成以下格式的xml文件: 每个属性都应放在单独的行中。

<parameters>
    <parameter 
        name="Tom" 
        city="York" 
        number="123"
    />
</parameters>

但是我只能将所有属性放在一行中

<parameters>
    <parameter name="Tom" city="York" number="123"/>
</parameters>

我正在使用dom4j,有人可以告诉我我该怎么做吗? dom4j是否支持这种格式? 谢谢。

2 个答案:

答案 0 :(得分:0)

通常来说,很少有XML序列化程序可以让您对输出格式进行这种级别的控制。

如果指定选项method=xmlindent=yessaxon:line-length=20,则可以使用Saxon序列化器获得接近的结果。 Saxon串行器能够将DOM4J树作为输入。您将需要Saxon-PE或-EE,因为它需要Saxon名称空间中的序列化参数。它仍然不是您想要的,因为第一个属性与元素名称在同一行,而其他属性在第一个属性下垂直对齐。

答案 1 :(得分:0)

除非您想实质性地重写主要逻辑,否则不能使用XMLWriter来实现。但是,由于XMLWriter也是SAX ContentHandler,因此可以使用SAX事件并将其序列化为XML,在这种操作模式下,XMLWriter使用不同的代码路径,该路径更易于自定义。以下子类将为您提供几乎所需的内容,除了空元素不会使用缩写形式<element/>。也许可以通过进一步调整来解决。

static class ModifiedXmlWriter extends XMLWriter {
    // indentLevel is private, need reflection to read it
    Field il;

    public ModifiedXmlWriter(OutputStream out, OutputFormat format) throws UnsupportedEncodingException {
        super(out, format);
        try {
            il = XMLWriter.class.getDeclaredField("indentLevel");
            il.setAccessible(true);
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        }
    }

    int getIndentLevel() {
        try {
            return il.getInt(this);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    protected void writeAttributes(Attributes attributes) throws IOException {
        int l = getIndentLevel();
        setIndentLevel(l+1);
        super.writeAttributes(attributes);
        setIndentLevel(l);
    }

    @Override
    protected void writeAttribute(Attributes attributes, int index) throws IOException {
        writePrintln();
        indent();
        super.writeAttribute(attributes, index);

    }
}

public static void main(String[] args) throws Exception {
    String XML = "<parameters>\n" + 
            "    <parameter name=\"Tom\" city=\"York\" number=\"123\"/>\n" + 
            "</parameters>";

    Document doc = DocumentHelper.parseText(XML);

    XMLWriter writer = new ModifiedXmlWriter(System.out, OutputFormat.createPrettyPrint());

    SAXWriter sw = new SAXWriter(writer);
    sw.write(doc);

}

示例输出:

<?xml version="1.0" encoding="UTF-8"?>

<parameters>
  <parameter
     name="Tom"
     city="York"
     number="123"></parameter> 
</parameters>