如何使用JAXB處理XML混合內(nèi)容,將Java對象映射到包含文本和標(biāo)簽的復(fù)雜XML結(jié)構(gòu)?

如何使用JAXB處理XML混合內(nèi)容,將Java對象映射到包含文本和標(biāo)簽的復(fù)雜XML結(jié)構(gòu)?

本文闡述如何利用JAXB庫將Java對象映射到包含混合內(nèi)容(文本和xml元素)的復(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>

直接使用JAXB映射此結(jié)構(gòu)時,break標(biāo)簽周圍的文本處理會遇到問題。為了解決這個問題,需要改進Java對象的定義。

原代碼中,VoiceXbj類試圖將標(biāo)簽作為獨立元素處理,忽略了其周圍的文本。改進后的VoiceXbj類使用@XmlMixed注解,允許包含文本和XML元素的混合內(nèi)容,并用@XmlElementRef注解指定BreakXbj類作為混合內(nèi)容中的一個元素類型。content屬性的類型也修改為List,以便同時存儲文本和BreakXbj對象。

修改后的VoiceXbj和BreakXbj類代碼如下:

立即學(xué)習(xí)Java免費學(xué)習(xí)筆記(深入)”;

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

在SsmlTest類中,我們創(chuàng)建VoiceXbj對象,并將文本和BreakXbj對象添加到content列表中。這樣,JAXB就能正確地將文本和標(biāo)簽映射到XML中。

修改后的SsmlTest類test1方法代碼如下:

@Slf4j public class SsmlTest {      @Test     public void test1() {         SpeakXbj xbj = new SpeakXbj();         List<VoiceXbj> voiceList = new ArrayList<>();         // ... (創(chuàng)建VoiceXbj對象和BreakXbj對象,并添加到列表中,代碼與原文相同) ...         xbj.setVoice(voiceList);         System.out.println(XmlUtil.convertToXml(xbj));     } }

通過這些修改,生成的XML結(jié)構(gòu)將準(zhǔn)確包含文本和標(biāo)簽,與目標(biāo)XML結(jié)構(gòu)一致。 XmlUtil類保持不變。

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