如何使用JAXB處理XML中混合文本和標(biāo)簽?

如何使用JAXB處理XML中混合文本和標(biāo)簽?

利用JAXB處理xml中混合文本和標(biāo)簽:標(biāo)簽的巧妙應(yīng)用

本文將詳細(xì)講解如何使用JAXB將Java對(duì)象映射到包含標(biāo)簽及其周邊文本的復(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)簽及其鄰近文本,但由于標(biāo)簽與文本混合出現(xiàn),導(dǎo)致映射失敗。 解決方法是結(jié)合使用@XmlMixed和@XmlElementRef注解來處理混合內(nèi)容。

改進(jìn)后的VoiceXbj類如下:

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

@XmlMixed注解聲明content屬性可以包含文本和其它XML元素。@XmlElementRef注解指定content列表中可以包含BreakXbj類型的對(duì)象。

BreakXbj類保持不變:

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

測(cè)試方法中,需將文本和BreakXbj對(duì)象添加到content列表:

@Slf4j public class SsmlTest {      @Test     public void test1() {         SpeakXbj xbj = new SpeakXbj();         List<VoiceXbj> voiceList = new ArrayList<>();         // ... (代碼與原文相同,略去重復(fù)部分) ...         System.out.println(XmlUtil.convertToXml(xbj));     } }

通過以上修改,JAXB可以正確地將Java對(duì)象映射到包含標(biāo)簽及其鄰近文本的XML結(jié)構(gòu)。 XmlUtil類和SpeakXbj類保持不變,最終生成的XML結(jié)構(gòu)與預(yù)期一致。

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