Java 向XmlObject添加CDATA
我正在编写一些与需要以下元素的遗留系统对话的代码:Java 向XmlObject添加CDATA,java,xmlbeans,Java,Xmlbeans,我正在编写一些与需要以下元素的遗留系统对话的代码: <BankRate><![CDATA[ ]]><BankRate> 这只会导致以下结果: <BankRate><BankRate> cc.setBankRate("<![CDATA[ ]]>"); 父级的选项是: setSaveCDataEntityCountThreshold(0)。setSaveCDataLengthThreshol
<BankRate><![CDATA[ ]]><BankRate>
这只会导致以下结果:
<BankRate><BankRate>
cc.setBankRate("<![CDATA[ ]]>");
父级的选项是:
setSaveCDataEntityCountThreshold(0)。setSaveCDataLengthThreshold(0)
如果我像下面这样做:
<BankRate><BankRate>
cc.setBankRate("<![CDATA[ ]]>");
cc.setBankRate(“”);
我得到了角色实体(这不是我想要的)我尝试了以下测试:
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 ) );
}
}
import org.apache.xmlbeans.*;
公共班机{
公共静态void main(字符串[]args)引发XmlException{
XmlObject x=XmlObject.Factory.parse(“”);
XmlCursor c=x.newCursor();
c、 toFirstContentToken();
c、 toNextToken();
c、 setBookmark(CDATA书签.CDATA\U书签);
XmlOptions=新的XmlOptions();
选项。设置SaveCDataLengthThreshold(1);
options.setUseCataBookmarks();
System.out.print(x.xmlText(选项));
}
}
结果是:
<BankRate><![CDATA[ ]]></BankRate>
<Moo> </Moo>
如果您的目标是强制将BankRate的内容保存为CDATA,那么您就是这样做的
但是,如果这不起作用,并且没有任何内容(空元素)作为BankRate的值,那么可能发生的情况是BankRate类型不是文本,而是忽略空白的其他类型。如果您真的需要将空格作为BankRate的值,则必须向其注入一个XmlCursor。因此,我正在尝试重新创建您的场景。下面是一个简单的模式,其中包含一个字符串类型的元素
<?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>
结果是:
<BankRate><![CDATA[ ]]></BankRate>
<Moo> </Moo>
您可以通过在文本之前插入CDATA书签来强制CDATA。在您的问题中,似乎缺少空格。这与您的问题有何不同?您可能需要将CDATA长度阈值设置为较低的值,因为您只输出一些空格作为文本元素。您可以参考以获得指导。我认为CDATA长度阈值不能低于0?您是否将其设置为零?默认值为32。setSaveCDataLengthThreshold(0)和setSaveCDataEntityCountThreshold(0)都是在选项上设置的BankRate元素的类型是什么?设置它可能会丢弃空白。IDE和源代码都确认BankRate确实是一个字符串。对于您的示例,如果您在parse方法中提供选项,而在.xmlText方法中不提供选项,那么您将无法获得CDATA。这是我正在编写的代码中的场景,它是创建节点细节的助手方法。CDATA看起来只是作为写入时间应用的,我只希望它出现在这个特定的节点上(而不是完整的SOAP消息)。没有办法强迫元素直接包含单个元素的CDATA,而不进行游标检查?解析阶段的setUseCataBookmarks会导致解析器插入书签,指明在源XML中找到CDATA的位置。保存阶段的setUseCatabookmarks会使CDATA在任何可以找到CDATA书签的地方使用。我知道只有一种方法可以将CDATA用于元素,那就是使用XmlCursor插入CDATA书签。如果要使邮件的其余部分不使用所有其他CDATA,请不要指定SetUseCataBookmarks,或使用光标手动删除书签。使用游标会困扰你吗?你的BankRate类型不会碰巧使用normalizedString类型,是吗?谢谢你的回复Eric!我对游标没有什么问题,只是在现阶段它似乎不适合我。甚至在我添加了您建议的额外代码行(c.toNextToken();)之后,如果我正在处理的直接节点的父节点使用了不同的XmlOptions,我认为这可能会覆盖我的光标设置。BankRate是一种正常的字符串类型。所有的setter都是由org.apache.axis2.wsdl.WSDL2Java生成的,它查看wsdl文件。问题出在Axis层(不是XmlBeans)