Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.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 转义XML字符而不转义CDATA标记_Java_Jaxb - Fatal编程技术网

Java 转义XML字符而不转义CDATA标记

Java 转义XML字符而不转义CDATA标记,java,jaxb,Java,Jaxb,我正在尝试使用JAXB序列化一个类,该类具有一些CDATA字段,以及一些包含需要转义的特殊字符的字段(包括)。问题是我不能让逃生处理在这两种情况下都正常工作 使用自定义CDATA适配器,如果我在封送拆收器上设置以下属性 jaxbMarshaller.setProperty(CharacterEscapeHandler.class.getName(), (CharacterEscapeHandler) (ch, start, length, isAttVal, out) ->

我正在尝试使用JAXB序列化一个类,该类具有一些CDATA字段,以及一些包含需要转义的特殊字符的字段(包括<和>)。问题是我不能让逃生处理在这两种情况下都正常工作

使用自定义CDATA适配器,如果我在封送拆收器上设置以下属性

jaxbMarshaller.setProperty(CharacterEscapeHandler.class.getName(),
        (CharacterEscapeHandler) (ch, start, length, isAttVal, out) -> out.write(ch, start, length));
我得到:

<key1><![CDATA[Test]]></key1> # What I want
<key2>some_>_value</key2>     # Invalid XML
#我想要什么
某些值无效的XML
如果我删除该属性并让jaxb处理自己的转义,我会得到:

<key1>&lt;![CDATA[Test]]&gt;  # Not what I want
<key2>some_&lt;_value</key2>  # What I want
![CDATA[测试]]#不是我想要的
一些我想要的东西
但我需要的是:

<key1><![CDATA[Test]]></key1>
<key2>some_&lt;_value</key2>

一些价值观

有什么方法可以这样使用转义处理程序函数吗?

您可以使用
com.sun.xml.bind.marshaller.CharacterEscapeHandler
接口来解决您的问题

示例Java类:

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class AA {

    String B;
    String C;


    public String getB() {
        return B;
    }

    @XmlElement
    public void setB(String b) {
        B = b;
    }

    @Override
    public String toString() {
        return "AA [B=" + B + ", C=" + C + ", D=" + D + "]";
    }

    public String getC() {
        return C;
    }

    @XmlElement
    public void setC(String c) {
        C = c;
    }

    public String getD() {
        return D;
    }

    @XmlElement
    public void setD(String d) {
        D = d;
    }

    String D;
}
示例XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<aa>
  <b>Title of Feed Item</b>
  <c>some_>_value</c>
  <d>
    <![CDATA[Test]]>
  </d>
</aa>


您可以使用
com.sun.xml.bind.marshaller.CharacterEscapeHandler
接口来解决问题

示例Java类:

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class AA {

    String B;
    String C;


    public String getB() {
        return B;
    }

    @XmlElement
    public void setB(String b) {
        B = b;
    }

    @Override
    public String toString() {
        return "AA [B=" + B + ", C=" + C + ", D=" + D + "]";
    }

    public String getC() {
        return C;
    }

    @XmlElement
    public void setC(String c) {
        C = c;
    }

    public String getD() {
        return D;
    }

    @XmlElement
    public void setD(String d) {
        D = d;
    }

    String D;
}
示例XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<aa>
  <b>Title of Feed Item</b>
  <c>some_>_value</c>
  <d>
    <![CDATA[Test]]>
  </d>
</aa>


就我所见,这仍然会给我错误的结果,因为
某些值
是无效的XML。就我所见,这仍然会给我错误的结果,因为
某些值
是无效的XML。