将CDATA添加到XmlObject

时间:2012-04-27 04:10:42

标签: java xmlbeans

我正在编写一些代码,这些代码与需要以下元素的遗留系统进行对话:

<BankRate><![CDATA[        ]]><BankRate>

我不能因为我的生活得到这个工作,我到目前为止的尝试是:

parent.setBankRate("    ");
XmlCursor cursor = cc.xgetBankRate().newCursor();
cursor.toFirstContentToken();
cursor.setBookmark(CDataBookmark.CDATA_BOOKMARK);
cursor.dispose();

这只会产生以下结果:

<BankRate><BankRate>

父母的选项是:     setSaveCDataEntityCountThreshold(0).setSaveCDataLengthThreshold(0);

如果我像以下那样setBankRate:

cc.setBankRate("<![CDATA[        ]]>");

我得到了字符实体(这不是我想要的)

2 个答案:

答案 0 :(得分:1)

我尝试了以下测试:

import org.apache.xmlbeans.*;

public class main {
    public static void main ( String[] args ) throws XmlException {
        XmlObject x = XmlObject.Factory.parse( "<BankRate>        </BankRate>" );
        XmlCursor c = x.newCursor();
        c.toFirstContentToken();
        c.toNextToken();
        c.setBookmark(CDataBookmark.CDATA_BOOKMARK);
        XmlOptions options = new XmlOptions();
        options.setSaveCDataLengthThreshold( 1 );
        options.setUseCDataBookmarks();
        System.out.print( x.xmlText( options ) );
    }
}

结果是:

<BankRate><![CDATA[        ]]></BankRate>

如果你的目标是强制将BankRate的内容保存为CDATA,那么你就是这样做的。

但是,如果这不起作用,并且你没有得到任何东西(空元素)作为BankRate的值,那么可能发生的是BankRate Type不是文本,而是忽略空格的其他类型。如果您确实需要将空格作为BankRate的值,则必须使用XmlCursor注入它。

答案 1 :(得分:1)

所以,我正在尝试重新创建你的场景。这是一个简单的模式,其元素是字符串类型。

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Moo" type="xs:string">
  </xs:element>
</xs:schema>

这是一个实例化类型的程序,将值设置为几个空格并保存。

import org.apache.xmlbeans.*;
import noNamespace.*;

public class main {
    public static void main ( String[] args ) throws XmlException {
        MooDocument moo = MooDocument.Factory.newInstance();
        moo.setMoo( "     " );
        System.out.print( moo.xmlText() );
    }
}

结果是:

<Moo>     </Moo>

您可以通过在文本前注入CDATA书签来强制CDATA。在您的问题中,空间似乎缺失。这与您的问题有何不同?