【问题标题】:adding CDATA to an XmlObject将 CDATA 添加到 XmlObject
【发布时间】:2012-04-27 04:10:42
【问题描述】:

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

<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);

如果我像下面这样设置BankRate:

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

我得到了角色实体(这不是我想要的)

【问题讨论】:

  • 您可能需要将 CDATA 长度阈值设置为较低的值,因为您只输出几个空格作为文本元素。您可以参考Javadoc 获取指导。
  • 我认为 cdataLengthThreshold 不能低于 0 吗?
  • 你把它设置为零了吗?默认值为 32。
  • setSaveCDataLengthThreshold(0) 和 setSaveCDataEntityCountThreshold(0) 都在选项上设置
  • BankRate 元素的类型是什么?设置它可能会丢弃空格。

标签: java xmlbeans


【解决方案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 类型不是文本,而是忽略空白的其他类型。如果您确实需要将空格作为 BankRate 的值,则必须将其注入 XmlCursor。

【讨论】:

  • IDE 和源都确认 BankRate 确实是一个字符串。 WRT 到您的示例,如果您在 parse 方法中提供选项并且在 .xmlText 方法中不提供选项,则不会获得 CDATA。这是我正在编写的代码中的场景,它是创建节点详细信息的辅助方法。 CDATA 似乎只用作写入时间,我只希望它在这个特定节点上(而不是完整的 SOAP 消息)。没有办法强制一个元素直接包含单个元素的 CDATA 而不通过游标的东西?
  • 解析阶段的 setUseCDataBookmarks 导致解析器注入书签,这些书签指示在源 XML 中找到 CDATA 的位置。保存阶段的 setUseCDataBookmarks 会导致 CDATA 在任何找到 CDATA 书签的地方使用。我知道只有一种方法可以使 CDATA 用于元素,那就是使用 XmlCursor 注入 CDATA 书签。如果您希望在消息的其余部分中不使用所有其他 CDATA,请不要指定 setUseCDataBookmarks,或者使用光标手动删除书签。使用游标会打扰您吗?
  • 您的 BankRate 类型不会碰巧使用 normalizedString 类型,对吗?
  • 感谢您的回复埃里克!我对光标没有真正的问题 - 在这个阶段它似乎对我不起作用。即使在我添加了您建议的额外代码行之后也是如此 (c.toNextToken();) 如果我正在处理的直接节点的父节点使用不同的 XmlOptions,我认为这可能会覆盖我的光标设置。
  • BankRate 是一个普通的字符串类型。所有的 setter 都是由查看 wsdl 文件的 org.apache.axis2.wsdl.WSDL2Java 生成的。
【解决方案2】:

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

<?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。在您的问题中,空格似乎丢失了。这与您的问题有何不同?

【讨论】:

  • 嗨,埃里克,我在上面发布回复之前错过了第二个答案。问题出在 Axis 层(不是 XmlBeans)
猜你喜欢
  • 1970-01-01
  • 2013-02-13
  • 2013-03-10
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多