Элемент XML с атрибутом и CDATA Как извлечь b, используя JAXB в Eclipse - PullRequest
0 голосов
/ 03 июля 2018

Элемент раздела 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 (имя = "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 голосов
/ 03 июля 2018

Не могли бы вы объяснить, как я могу получить как атрибут, так и CDATA? Я попробовал следующий способ, но я могу только вывести CDATA, а атрибут пропущен. Может быть, это не может быть тип String? @XmlRootElement (имя = "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;
}
0 голосов
/ 03 июля 2018

То, что вы делаете неправильно, думает, что разделы CDATA являются чем-то особенным и что их содержание может быть рассмотрено отдельно от окружающего текста.

Другими словами, когда у вас есть это:

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

Вы думаете, что можете извлечь строку "Hello" и еще одну строку "Все на месте!" И еще одну строку "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, его не существует. Вы можете получить только весь текст в <Data>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...