Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向XmlObject添加CDATA_Java_Xmlbeans - Fatal编程技术网

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)