Как избежать кодировки символов в Apache Abdera

Я работаю над написанием простого редактора статей, который будет использоваться с системой CMS, которая предлагает API Atom для добавления / редактирования статей. Для связи с CMS я использую библиотеку Apache Abdera. Но у меня проблема с кодировкой символов. Данные, отправленные в CMS, будут закодированы следующим образом:

<entry>
  <content xmlns:vdf="http://www.vizrt.com/types" type="xml">
    <vdf:payload>
      <vdf:field name="body">
        <vdf:value>&lt;div xmlns="http://www.w3.org/1999/xhtml">&lt;p>Text comes here&lt;/p>&lt;/div></vdf:value>
      </vdf:field>
    </vdf:payload>
  </content>
</entry>

Но система CMS требует этого:

<entry>
  <content xmlns:vdf="http://www.vizrt.com/types" type="xml">
    <vdf:payload>
      <vdf:field name="body">
        <vdf:value><div xmlns="http://www.w3.org/1999/xhtml"><p>Text comes here</p></div></vdf:value>
      </vdf:field>
    </vdf:payload>
  </content>
</entry>

Другими словами, ни один персонаж не может сбежать. Кто-нибудь знает, как этого можно добиться с помощью Apache Abdera?

1 ответ

Я не совсем знаком с внутренностями abdera и поэтому не могу точно объяснить, что здесь происходит, но я думаю, что суть в том, что вы не можете использовать строки или простой текст в качестве значений, если вы не хотите, чтобы abdera избегала вещей. Вместо этого вы должны использовать Element с абдера-типом XHtml,

Как-то так у меня сработало

String body = "<p>Text comes here</p>"

//put the text into an XHtml-Element (more specificly an instance of Div)
//I "misuse" a Content object here, because Content offers type=XHtml. Maybe there are better ways.
Element el = abdera.getFactory().newContent(Content.Type.XHTML).setValue(body).getValueElement();

//now create your empty <vdf:value/> node.
QName valueQName = new QName("http://your-vdf-namespace", "value", "vdf");
ExtensibleElement bodyValue = new ExtensibleElementWrapper(abdera.getFactory(),valueQName);

//now attach the Div to that empty node. Not sure what's happening here internally, but this worked for me :)
bodyValue.addExtension(el);

Сейчас, bodyValue может быть использован в качестве значения для вашего поля, и Абдера должна сделать все правильно.

Другие вопросы по тегам