首页 > 解决方案 > 如何抑制 BeanIO XML 生成中的根元素?

问题描述

使用 BeanIO 生成 XML 文件时,StreamBuilder 名称用作根元素。如何抑制这个根元素?

例子:

StreamBuilder builder = new StreamBuilder("builder_name")
    .format("xml")
    .parser(new XmlParserBuilder()).addRecord(Test.class);

Test班级:

@Record
public class Test {

    @Field(at=0)
    private String field1 = "ABC";

    // Getters and Setters ...

}

生成的 XML 文件:

<builder_name>
  <Test>
    <field1>ABC</field1>
  </Test>
</builder_name>

我不想builder_name被显示为根元素。我希望Test元素成为根。我怎样才能做到这一点?

标签: bean-io

解决方案


您需要在流配置中设置xmlType属性/属性。XmlType.NONE

答案在文档的附录 A - XML 映射文件参考 中。

xmlType - 映射到流的 XML 节点类型。如果未指定或设置为 element,则流将映射到正在编组或取消编组的 XML 文档的根元素。如果设置为 none,则 XML 输入流将被完全读取并映射到子组或记录。

现在的诀窍是将这条信息转换为 StreamBuilder API,即:

xmlType(XmlType.NONE)

你的例子就变成了:

StreamBuilder builder = new StreamBuilder("builder_name")
  .format("xml")
  .xmlType(XmlType.NONE)
  .parser(new XmlParserBuilder())
  .addRecord(Test.class);

这会产生这个未格式化/未缩进的输出:

<?xml version="1.0" encoding="utf-8"?><test><field1>ABC</field1></test>

要格式化 xml(漂亮的打印)/缩进使用:

StreamBuilder builder = new StreamBuilder("builder_name")
  .format("xml")
  .xmlType(XmlType.NONE)
  .parser(new XmlParserBuilder()
    .indent()
  )
  .addRecord(Test.class);

请注意对 , 的更改以XmlParserBuilder生成此输出:

<?xml version="1.0" encoding="utf-8"?>
<test>
  <field1>ABC</field1>
</test>

推荐阅读