JAXB解组混合XML内容异常:无法同时获取文本与子元素值
解决JAXB解析XML混合内容的问题
你遇到的问题是JAXB默认处理混合内容(文本+子元素)的机制导致的:当<question>元素同时包含文本和子元素时,@XmlValue无法捕获文本内容,而且你的measure字段也没有添加对应的JAXB注解,所以两个字段都没被正确赋值。
解决方案:使用@XmlMixed处理混合内容
要同时捕获<question>里的文本和<measure>子元素,你需要修改Question类,用@XmlMixed来收集所有文本节点,再用@XmlElement绑定子元素:
@XmlAccessorType(XmlAccessType.NONE) @ToString public class Question implements Serializable { // 用@XmlMixed捕获所有文本节点(包括子元素前后的文本) @XmlMixed private List<String> questionTexts; // 绑定<measure>子元素 @XmlElement(name = "measure") private String measure; // 可选:提供一个合并文本的getter,方便获取完整的问题文本 public String getQuestionText() { if (questionTexts == null || questionTexts.isEmpty()) { return null; } // 合并所有文本节点并去除首尾空白 return String.join("", questionTexts).trim(); } }
为什么这样能解决问题?
@XmlMixed注解会告诉JAXB将元素中的所有文本节点(不管是在子元素之前、之后还是中间的文本)收集到List<String>中,这样即使有子元素,文本内容也不会丢失。@XmlElement(name = "measure")明确指定了绑定<measure>子元素到measure字段,之前的代码因为缺少这个注解,所以JAXB不会解析这个子元素。
测试结果
修改后再解析你的两个XML示例:
解析
XML_STRING(纯文本的<question>):Root(name=Michael, question=Question(questionTexts=[Text here], measure=null))调用
getQuestionText()会返回"Text here"。解析
XML_STRING_2(包含子元素的<question>):Root(name=Michael, question=Question(questionTexts=[Text here], measure=More Text))调用
getQuestionText()会返回"Text here",同时measure字段正确获取到"More Text"。
如果你的<question>里文本分散在子元素前后(比如<question>Hello<measure>test</measure>World</question>),questionTexts会包含["Hello", "World"],getQuestionText()会合并成"HelloWorld",完美适配各种混合内容场景。
内容的提问来源于stack exchange,提问作者Michael Goodwin
相关产品推荐
相关产品推荐

