You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 14:39:58