如何使用JAXB处理包含标签和混合内容的复杂XML结构?

如何使用JAXB处理包含标签和混合内容的复杂XML结构?标签和混合内容” />

JAXB映射复杂xml结构:巧妙处理标签和混合内容

本文将详细介绍如何使用JAXB将Java对象映射到包含标签和混合文本内容的复杂XML结构。目标XML结构如下:

<speak>   <voice name="zh-cn-yunxineural">我是     <break time="1000ms"></break>张三   </voice>   <voice name="zh-cn-xiaoxiaoneural">他是     <break time="100ms"></break>李四   </voice> </speak>

直接使用@XmlElement注解处理标签及其旁侧文本内容并不理想,因为元素包含文本和标签,属于混合内容。 为了解决这个问题,我们需要调整VoiceXbj类。

我们将VoiceXbj类中的breakXbj属性从List更改为List,并使用@XmlMixed和@XmlElementRef注解。@XmlMixed注解表示该属性可以包含文本和其它XML元素,@XmlElementRef指定可包含的XML元素类型(此处为BreakXbj)。修改后的VoiceXbj类如下:

@Data @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "voice") public class VoiceXbj {      @XmlAttribute     private String name;      @XmlMixed     @XmlElementRef(type = BreakXbj.class)     private List<Object> content;  }

BreakXbj类保持不变:

@Data @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "break") public class BreakXbj {      @XmlAttribute     private String time; }

在测试类SsmlTest中,我们将文本内容和BreakXbj对象一起添加到content列表中:

@Slf4j public class SsmlTest {      @Test     public void test1() {         SpeakXbj xbj = new SpeakXbj();         List<VoiceXbj> voiceList = new ArrayList<>();         // ... (代码与原文相同,只是将ArrayList()改为ArrayList<>()) ...         xbj.setVoice(voiceList);         System.out.println(XmlUtil.convertToXml(xbj));     } }

通过这些修改,JAXB能够正确地将Java对象映射到目标XML结构,成功处理混合内容,生成预期的XML输出。SpeakXbj类和XmlUtil类保持不变。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享