如何使用JAXB處理包含標(biāo)簽和混合內(nèi)容的復(fù)雜XML結(jié)構(gòu)?

如何使用JAXB處理包含標(biāo)簽和混合內(nèi)容的復(fù)雜XML結(jié)構(gòu)?標(biāo)簽和混合內(nèi)容” />

JAXB映射復(fù)雜xml結(jié)構(gòu):巧妙處理標(biāo)簽和混合內(nèi)容

本文將詳細(xì)介紹如何使用JAXB將Java對(duì)象映射到包含標(biāo)簽和混合文本內(nèi)容的復(fù)雜XML結(jié)構(gòu)。目標(biāo)XML結(jié)構(gòu)如下:

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

直接使用@XmlElement注解處理標(biāo)簽及其旁側(cè)文本內(nèi)容并不理想,因?yàn)?voice>元素包含文本和標(biāo)簽,屬于混合內(nèi)容。 為了解決這個(gè)問題,我們需要調(diào)整VoiceXbj類。

我們將VoiceXbj類中的breakXbj屬性從List更改為L(zhǎng)ist,并使用@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; }

在測(cè)試類SsmlTest中,我們將文本內(nèi)容和BreakXbj對(duì)象一起添加到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對(duì)象映射到目標(biāo)XML結(jié)構(gòu),成功處理混合內(nèi)容,生成預(yù)期的XML輸出。SpeakXbj類和XmlUtil類保持不變。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊9 分享