我有这段代码:
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以避免复杂的空元素? 感谢。
答案 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>