gpt4 book ai didi

java XMLSerializer 避免复杂的空元素

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:22:13 26 4
gpt4 key购买 nike

我有这个代码:

    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 以避免复杂的空元素吗?谢谢。

最佳答案

结果:我认为这是不可能的。 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( ">" );

意见:我不确定是否没有干净的解决方案,我将此解决方案视为不得已的解决方案。无论如何,您应该自己查看来源和/或文档以获取更多信息。

关于java XMLSerializer 避免复杂的空元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10726974/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com