使用ToXmlGenerator序列化XML时,如何生成带属性的元素文本内容?
问题描述
需要序列化生成如下格式的XML:
<item id="123">description</item>
现有序列化代码如下:
toXmlGenerator.writeFieldName("item"); toXmlGenerator.writeStartObject(); toXmlGenerator.setNextIsAttribute(true); toXmlGenerator.writeFieldName("id"); toXmlGenerator.writeString(element.getId()); toXmlGenerator.setNextIsAttribute(false); toXmlGenerator.writeStringField("",element.getValue()); toXmlGenerator.writeEndObject();
但生成的结果不符合预期,输出为:
<item id="123"> <></>description</> </item>
尝试过修改writeStringField为空字符串的写法,也试过直接调用toXmlGenerator.writeString(element.getValue());,但触发了如下错误:
com.fasterxml.jackson.databind.JsonMappingException: Can not write String value, expecting field name
请问有没有正确的实现方法?
解决方案
直接使用writeRawValue方法写入元素的文本内容即可解决问题,替换原有代码中写入值的逻辑:
toXmlGenerator.writeFieldName("item"); toXmlGenerator.writeStartObject(); // 处理id属性 toXmlGenerator.setNextIsAttribute(true); toXmlGenerator.writeFieldName("id"); toXmlGenerator.writeString(element.getId()); toXmlGenerator.setNextIsAttribute(false); // 写入元素的文本内容,无需额外标签 toXmlGenerator.writeRawValue(element.getValue()); toXmlGenerator.writeEndObject();
writeRawValue的作用是写入不需要被包裹在字段标签中的原始值,正好匹配你需要的<item>标签直接包含文本内容的场景。
如果不想手动操作生成器,也可以通过Jackson XML的注解简化实现:给实体类添加@JacksonXmlRootElement(localName = "item"),给id字段添加@JacksonXmlProperty(isAttribute = true),这样序列化时会自动生成符合要求的XML结构。
内容的提问来源于stack exchange,提问作者zepol
相关产品推荐
相关产品推荐

