我正在写一个简单的文章编辑器,它将与CMS系统配合使用,该系统提供Atom API来添加/编辑文章。为了与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如何做到这一点?

最佳答案

我并不完全了解abdera的内部结构,因此无法确切解释此处发生的情况,但是我认为本质是,如果您不希望abdera逃脱某些东西,则不能使用字符串或纯文本作为值。相反,您必须使用abdera类型ElementXHtml

这样的事情对我有用:

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可用作字段的值,Abdera应该正确呈现所有内容。

09-30 17:48