Java 避免为空元素生成XML自动关闭标记,并生成自定义标记<;xml>;起始标签
我需要生成一个XML文件,其中包含一些数据,以便发送到我手上没有的第三方系统(由另一家公司制造,我无法修改或要求修改) 另一个系统不接受我生成的文档,因为它有一些空元素的自动关闭标记:Java 避免为空元素生成XML自动关闭标记,并生成自定义标记<;xml>;起始标签,java,xml,xslt,Java,Xml,Xslt,我需要生成一个XML文件,其中包含一些数据,以便发送到我手上没有的第三方系统(由另一家公司制造,我无法修改或要求修改) 另一个系统不接受我生成的文档,因为它有一些空元素的自动关闭标记:而不是 我现在的代码就是这样的 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); trans
而不是
我现在的代码就是这样的
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
StreamResult streamResult = new StreamResult(file);
transformer.transform(source, streamResult);
为了生成完整的结束标记,我尝试要求Transformer
使用html
输出方法:
transformer.setOutputProperty(OutputKeys.METHOD, "html");
资料来源:
这适用于具有完整的结束标记,但我还有其他问题:
- 未生成XML文档起始标记(如
) - 特殊字符以HTML方式生成(如
而不是é;
)é
StAXResult
而不是像这样的StreamResult
:
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(new BufferedWriter(new FileWriter(nomFichier)));
StAXResult streamResult = new StAXResult(writer);
transformer.transform(source, streamResult);
这也适用于在空元素上有完整的结束标记,但我的XML文档开始标记不完整:
<?xml version="1.0"?>
由于使用了StAXResult
迈克尔·凯(Michael Kay)在书中明确指出:
调用Transformer.setOutputProperty(OutputKeys.ENCODING,“ISO-8859-1”)除非变压器正在生产,否则代码>无效
序列化输出。在您的情况下,变压器不工作
序列化输出,因为您正在将输出发送到StAXResult
我尝试配置XMLStreamWriter
以至少定义编码:
XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(new BufferedWriter(new FileWriter(nomFichier)));
writer.writeStartDocument("ISO-8859-1", "1.0");
StAXResult streamResult = new StAXResult(writer);
transformer.transform(source, streamResult);
这将导致添加“正确”的起始XML标记,但我还有来自Transformer的默认标记:
<?xml version="1.0" encoding="ISO-8859-1"?><?xml version="1.0"?>
但正如前面所说的,这不起作用,因为变压器的输出属性被忽略了
关于如何实现这两个目标有什么想法吗?
- 有效的XML起始标记(
) - 正确的字符编码(
而不是e
)é;
- 元素为空时的完全结束标记(
而不是
)
XMLStreamWriter
和StAXResult
编写文档,然后处理生成的文件以对其进行解析,删除
元素并用硬编码的
字符串替换它,但我并不真的想为此解析生成的XML文件,因为它可能相当大
我正在寻找一个更优雅的解决方案
提前感谢您的帮助。如果您想避免使用XML自动关闭标记,可以使用
@JsonProperty(value = "TEST")
@JsonSerializer(nullsUsing = NullSerializer.class)
private String test;
NullSerializer:它将是一个从JsonSerializer扩展而来的类,它将返回null
因此,如果“test”变量为null,则生成的XML消息如下所示:
<TEST></TEST>
而不是:
<TEST/>
如果要创建文件,为什么要使用StAXResult?正如您在回答中提到的,您正在将一个树结构转换为另一个树结构。XML永远不会序列化,因此不会考虑序列化设置
您的主要问题似乎是希望避免使用自动关闭标记,但这毫无意义,因为自动关闭标记在语义上与一对打开/关闭标记相同。我认为唯一的解决方法是使用XSLT,在XSLT中,通过添加一些不会在其间产生任何输出的内容,欺骗处理器编写开始和结束标记。但这可能也取决于您的处理器。最后,您试图将XML发送到一个无法理解XML的系统,因此您将始终不得不求助于黑客。问题是,我不能将变量与那样的注释一起使用,因为我从数据库中的结构化对象动态生成XML内容:
Element tag=document.createElement(“mytag”); tag.appendChild(document.createTextNode(object.getXXX()!=null?object.getXXX().toString():“”)代码>如果我必须将生成的每个值设置为一个类变量,这将是超重的…:-/
<TEST></TEST>
<TEST/>