具有属性和CDATA的XML元素如何在Eclipse中使用JAXB检索b

时间:2018-07-03 04:48:10

标签: java jaxb

XML的section元素包括一个属性和CDATA:

        ELEM: nodeName="ConfigData" local="ConfigData"
            ATTR: nodeName="ConfigSize" local="ConfigSize" nodeValue="356"
              TEXT: nodeName="#text" nodeValue="356"
          TEXT: nodeName="#text" nodeValue=[WS]
          ELEM: nodeName="Data" local="Data"
              ATTR: nodeName="Format" local="Format" nodeValue="L5K"
                TEXT: nodeName="#text" nodeValue="L5K"
            TEXT: nodeName="#text" nodeValue=[WS]
            CDATA: nodeName="#cdata-section" nodeValue="[360,0,6,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]"
            TEXT: nodeName="#text" nodeValue=[WS]
          TEXT: nodeName="#text" nodeValue=[WS]
        TEXT: nodeName="#text" nodeValue=[WS]

我使用了以下代码,但无法获取CDATA。 @XmlRootElement(name =“ ConfigData”)

public class ConfigData {

  private int configSize;
  private Data data;

  @XmlElement(name="Data")
  public void setData(Data data) {  
    this.data = data;  
  } 
  public Data getData() {
        return data;
    }
}

@XmlRootElement(name="Data")

public class Data {

  private String format;
  private String cData;

  @XmlAttribute(name="Format")
    public void setFormat(String format) {
    this.format = format;
    }
  public String getFormat() {
        return format;
    }

  @XmlCDATA()
  @XmlJavaTypeAdapter(value=AdapterXmlCDATA.class)
  public void setCData(String cData) {  
    this.cData = cData;  
  }  
  public String getCData() {  
    return cData;  
  }  
}

public class AdapterXmlCDATA extends XmlAdapter<String, String> {

    @Override
    public String marshal(String value) throws Exception {
        return "<![CDATA[" + value + "]]>";
    }
    @Override
    public String unmarshal(String value) throws Exception {
      //System.out.println("AdapterXmlCDATA:" + value);
      return value;
    }
}

如果有人能告诉我我做错了,我将不胜感激。我在想,如果在数据类中使用正确的CDATA表示法,例如“ @XmlCDATA()     @XmlJavaTypeAdapter(value = AdapterXmlCDATA.class)”可以使其正常工作。谢谢

2 个答案:

答案 0 :(得分:0)

您在做错的是,认为CDATA节在某种程度上是特殊的,并且可以将其内容与周围的文本区分开来。

换句话说,当您拥有这个时:

<stuff>Hello <![CDATA[Everyone is in the place! ]]>Goodbye</stuff>

您认为您可以提取字符串“ Hello”和另一个字符串“每个人都在这里!”和另一个字符串“再见”。

情况并非如此。您无法做到这一点,您必须忘记尝试这样做。

上面的标记与此标记完全相同:

<stuff>Hello Everyone is in the place! Goodbye</stuff>

如您所见,无法识别原始标记中CDATA部分中可能包含的内容,因为当您尝试使用XML时,CDATA部分根本不存在。 CDATA部分仅是一种语法工具,用于当您想要编写不想不断转义的奇怪文本时,例如

<![CDATA[ <<<<<< &&& Yeah! &&& >>>>>> ]]>

更清晰
&lt;&lt;&lt;&lt;&lt;&lt; &amp;&amp;&amp; Yeah! &amp;&amp;&amp; &gt;&gt;&gt;&gt;&gt;&gt;

但XML完全相同。

底线:您无法获取CDATA部分的内容。就XML读取而言,它不存在。您只能在<Data>中获得全部文本。

答案 1 :(得分:0)

请您解释一下如何同时检索属性和CDATA?我尝试了以下方法,但是我只能取出CDATA,而忽略了该属性。也许不能是String类型? @XmlRootElement(name =“ ConfigData”)

公共类ConfigData {

private int configSize;

private String data;

@XmlElement(name="Data")
public void setData(String data) {  
    System.out.println("ConfigData:" + data);
    this.data = data;  
} 
public String getData() {
    return data;
}