【问题标题】:XML Element with attribute and CDATA How to retrieve b both using JAXB in Eclipse具有属性和 CDATA 的 XML 元素如何在 Eclipse 中使用 JAXB 检索 b
【发布时间】:2018-07-03 04:48:10
【问题描述】:

XML 的一个节元素包括一个属性和 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)" 可以让它工作。谢谢

【问题讨论】:

  • @XmlCDATA() 到底是什么?它的完全限定名称的导入声明是什么?

标签: java jaxb


【解决方案1】:

您的错误在于认为 CDATA 部分有些特殊,并且可以将其内容与周围的文本区分开来。

换句话说,当你有这个时:

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

您认为您可以提取字符串“Hello”、另一个字符串“Everyone is in the place!”和另一个字符串“Goodbye”。

事实并非如此。你不能这样做,你必须忘记尝试这样做。

以上标记与此标记 100% 相同:

<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 读取而言,它不存在。只能获取&lt;Data&gt;中的全文。

【讨论】:

    【解决方案2】:

    您能解释一下我如何检索属性和 CDATA 吗?我尝试了以下方式,但只能将CDATA取出,并且属性被遗漏了。也许它不能是字符串类型? @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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-27
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多