Java 使用JAXB将XML CDATA字符串解组为文本

Java 使用JAXB将XML CDATA字符串解组为文本,java,xml,jaxb,cdata,Java,Xml,Jaxb,Cdata,考虑以下简单的XML字符串: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <example> <value name="test">abcd</value> </example> 要将上述XML字符串解组(反序列化)为原始Example对象,可以使用以下代码: public static void main(String[] args) throws Ex

考虑以下简单的
XML
字符串:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<example>
    <value name="test">abcd</value>
</example>
要将上述
XML
字符串解组(反序列化)为原始
Example
对象,可以使用以下代码:

  public static void main(String[] args) throws Exception {
    JAXBContext context = JAXBContext.newInstance(Example.class);
    String input = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
      "<example>\n" +
      "    <value name=\"test\">abcd</value>\n" +
      "</example>";
    Unmarshaller um = context.createUnmarshaller();
    Example v = (Example)um.unmarshal(new ByteArrayInputStream(input.getBytes()));
    System.out.println(v.getValue().getValue());
  }
一种方法是将自定义的
DOMHandler
xmlanyement
注释一起使用,但它似乎不起作用


是否有任何方法将
abcd
字符串反序列化为文本(即不将其包含在
CDATA
部分)?

唯一的方法是替换特殊字符
“&”
带有字符引用
&qout&
etc

我认为您必须将xml字符串中的特殊字符替换为下面的字符

abcd&lt;&gt; instead of `abcd<>`
abcd而不是'abcd`

您是否尝试过在解组之前创建一个附加CDATA标记的方法

 public String addCdataTags (String yourString){
        return "<![CDATA[" + yourString + "]]>"
     }
publicstringaddcdatags(stringyourstring){
返回“”
}
这应该考虑那些被错误地视为xml元素标记的CDATA字符串

有没有办法将abcd字符串反序列化为文本 (即,不将其包含在CDATA区域中)

不,因为您的XML无效

问题是试图解组未知输入,因此 无法进行预处理

要使用任何XML工具,都需要确保输入是有效的XML

无效的XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<example>
    <value name="test">abcd<></value>
</example>
使用解析的字符数据使其有效

使XML有效的一种方法是将
替换为
。JAXB实现将把XML值
abcd
解组为
字符串
abcd

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<example>
    <value name="test"><![CDATA[abcd<>]]></value>
</example>

这样做的目的是避免这样做。:-)应该在何处添加该方法?就在调用unmarshaller.unmarshal(new ByteArrayInputStream(input.getBytes());这只是一个演示。问题是尝试对未知输入进行解组,因此无法进行此类预处理。您链接到的建议解决方案()是将未编组的XML的一部分保留为
字符串
。它仍然要求XML有效。您在所有帐户中都是对的,CDATA似乎是唯一的解决方法。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<example>
    <value name="test">abcd<></value>
</example>
org.xml.sax.SAXParseException; The content of elements must consist of well-formed character data or markup.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<example>
    <value name="test">abcd&lt;&gt;</value>
</example>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<example>
    <value name="test"><![CDATA[abcd<>]]></value>
</example>