猿问

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

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


<parameters>

    <parameter 

        name="Tom" 

        city="York" 

        number="123"

    />

</parameters>

但我只能在一行中获取所有属性


<parameters>

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

</parameters>

我正在使用 dom4j,谁能告诉我如何制作它?dom4j 支持这种格式吗?谢谢。


慕哥6287543
浏览 636回答 2
2回答

慕沐林林

XMLWriter除非您想大量重写主要逻辑,否则您不能使用。但是,由于XMLWriter也是 SAX,ContentHandler它可以使用 SAX 事件并将它们序列化为 XML,并且在这种操作模式下,XMLWriter使用更易于定制的不同代码路径。下面的子类将给你几乎你想要的东西,除了空元素不会使用短格式<element/>。也许这可以通过进一步调整来解决。static class ModifiedXmlWriter extends XMLWriter {&nbsp; &nbsp; // indentLevel is private, need reflection to read it&nbsp; &nbsp; Field il;&nbsp; &nbsp; public ModifiedXmlWriter(OutputStream out, OutputFormat format) throws UnsupportedEncodingException {&nbsp; &nbsp; &nbsp; &nbsp; super(out, format);&nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; il = XMLWriter.class.getDeclaredField("indentLevel");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; il.setAccessible(true);&nbsp; &nbsp; &nbsp; &nbsp; } catch (NoSuchFieldException e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new RuntimeException(e);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; int getIndentLevel() {&nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return il.getInt(this);&nbsp; &nbsp; &nbsp; &nbsp; } catch (IllegalAccessException e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new RuntimeException(e);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; protected void writeAttributes(Attributes attributes) throws IOException {&nbsp; &nbsp; &nbsp; &nbsp; int l = getIndentLevel();&nbsp; &nbsp; &nbsp; &nbsp; setIndentLevel(l+1);&nbsp; &nbsp; &nbsp; &nbsp; super.writeAttributes(attributes);&nbsp; &nbsp; &nbsp; &nbsp; setIndentLevel(l);&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; protected void writeAttribute(Attributes attributes, int index) throws IOException {&nbsp; &nbsp; &nbsp; &nbsp; writePrintln();&nbsp; &nbsp; &nbsp; &nbsp; indent();&nbsp; &nbsp; &nbsp; &nbsp; super.writeAttribute(attributes, index);&nbsp; &nbsp; }}public static void main(String[] args) throws Exception {&nbsp; &nbsp; String XML = "<parameters>\n" +&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "&nbsp; &nbsp; <parameter name=\"Tom\" city=\"York\" number=\"123\"/>\n" +&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "</parameters>";&nbsp; &nbsp; Document doc = DocumentHelper.parseText(XML);&nbsp; &nbsp; XMLWriter writer = new ModifiedXmlWriter(System.out, OutputFormat.createPrettyPrint());&nbsp; &nbsp; SAXWriter sw = new SAXWriter(writer);&nbsp; &nbsp; sw.write(doc);}示例输出:<?xml version="1.0" encoding="UTF-8"?><parameters>&nbsp; <parameter&nbsp; &nbsp; &nbsp;name="Tom"&nbsp; &nbsp; &nbsp;city="York"&nbsp; &nbsp; &nbsp;number="123"></parameter>&nbsp;</parameters>

开满天机

一般来说,很少有 XML 序列化程序可以让您对输出格式进行这种级别的控制。如果指定选项method=xml,&nbsp;indent=yes, ,则可以使用 Saxon 序列化程序获得与此类似的结果saxon:line-length=20。Saxon 序列化器能够将 DOM4J 树作为输入。您将需要 Saxon-PE 或 -EE,因为它需要 Saxon 命名空间中的序列化参数。它仍然不是您想要的,因为第一个属性将与元素名称在同一行,而其他属性将在第一个属性下方垂直对齐。
随时随地看视频慕课网APP

相关分类

Java
我要回答