java XMLSerializer避免复杂的空元素

时间:2012-05-23 19:59:58

标签: java xmlserializer

我有这段代码:

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    DOMImplementation impl = builder.getDOMImplementation();
    Document xmldoc = impl.createDocument(null, null, null);

    Element root = xmldoc.createElement("root");
    Element textElement = xmldoc.createElement("text");
    Text textNode = xmldoc.createTextNode("");
    root.appendChild(textElement);
    textElement.appendChild(textNode);

    OutputFormat of = new OutputFormat("XML","UTF-8",true);
    of.setIndent(1);
    of.setIndenting(true);

    ByteArrayOutputStream stream = new ByteArrayOutputStream();

    XMLSerializer serializer = new XMLSerializer(stream, of);
    // As a DOM Serializer
    serializer.asDOMSerializer();
    serializer.serialize(root);

    System.out.println(stream.toString());

我要安慰这个:

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

但是,我想得到这个:

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

有谁知道,如何设置XMLSerializer以避免复杂的空元素? 感谢。

2 个答案:

答案 0 :(得分:3)

结果:我认为不可能。 XMLSerializer不支持此类配置。

<强>分析: 当您致电serializer.serialize(root)时,会调用BaseMarkupSerializer's serialize(Element)方法。它定义了您传递给序列化的节点类型,并选择适当的方式来处理它。

说到文本节点,它调用XMLSerializer's serializeElement(Element)方法:

// If element has children, then serialize them, otherwise
// serialize en empty tag.       
if (elem.hasChildNodes()) {
    //... irrelevant code...
    endElementIO( null, null, tagName );
} else {
    //... irrelevant code...
    _printer.printText( "/>" ); // <------ HARDCODED, NON-CONFIGURABLE
    //... irrelevant code...
}

<强>问题: 正如您所看到的,关闭空元素的方法是硬编码的,不可配置(如果您从源代码中查找完整的代码片段)。

<强>解决方案: 由于XMLSerializer不是最终的,您可以通过扩展它并覆盖它的方法来创建自己的序列化程序。其中一种方式是改变:

_printer.printText( "/>" );

_printer.printText( "</" );
_printer.printText( elem.getTagName() );
_printer.printText( ">" );

<强>意见: 我不确定是否没有干净的解决方案,我认为这个解决方案是最后的解决方案。无论如何,您应该查看源代码和/或文档以获取更多信息。

答案 1 :(得分:1)

我遇到了同样的问题,XMLSerializer不允许渲染空标记的自定义。我的解决方案是扩展原始XMLSerializer代码并覆盖serializeElement方法:

我复制了原始代码并更改了结束打印部分:

protected void serializeElement(Element elem)抛出IOException ...

if (isSelfClosingElement(elem))
    _printer.printText("/>");
else
_printer.printText("></" + elem.getTagName() + ">");

其中 isSelfClosingElement 包含自闭元素列表

注意:另外,您需要复制 printAttribute() printNamespaceAttr()方法,因为它被标记为私有而非受保护。< / p>