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

时间:2015-01-27 03:46:35

标签: java xml jaxb cdata

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

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

以下代码定义了2个Java类(Example.classValue.class),可用于生成上述XML输出,用于字符串值{{1} }:

abcd

要将上面的@XmlRootElement(name = "example") public class Example { private Value value; private Example() {} public Value getValue() { return value; } public void setValue(Value value) { this.value = value; } @XmlAccessorType(XmlAccessType.FIELD) private static final class Value { @XmlValue private String value; @XmlAttribute(name="name") private String name; public Value() {} public String getValue() { return value; } public void setValue(String value) { this.value = value; } public String getName() { return name; } public void setName(String name) { this.name = name; } } } 字符串解组(反序列化)到它生成的原始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()); } 方法中的字符串值从main()更改为abcd或任何其他abcd<>字符串,则unmarshaller会抛出异常:

CDATA

proposed solution是使用带有org.xml.sax.SAXParseException; The content of elements must consist of well-formed character data or markup. 注释的自定义DOMHandler,但它似乎不起作用。

有没有办法将XmlAnyElement字符串反序列化为文字(即,不将其括在abcd<>部分中)?

4 个答案:

答案 0 :(得分:2)

  

有没有办法反序列化abcd&lt;&gt;字符串作为文字   (即,不将其封入CDATA部分)?

不,因为您的XML无效。

  

问题是尝试解组未知输入,因此   预处理是不可能的

您需要确保输入是有效的XML才能使用任何XML工具。

无效的XML

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

当您尝试解析上述XML时,您会遇到以下异常。该异常来自JAXB使用的底层解析器。 XML解析器依赖于表示元素标记的尖括号。将元素包含在元素内容中时必须特别小心。

org.xml.sax.SAXParseException; The content of elements must consist of well-formed character data or markup.

使用解析后的字符数据生效

使XML有效的一种方法是将<替换为&lt;,将>替换为&gt;。您的JAXB实现会将XML值abcd&lt;&gt;解组为Stringabcd<>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<example>
    <value name="test">abcd&lt;&gt;</value>
</example>

使用字符数据生效

使XML有效的另一种方法是将字符内容包装在CDATA块中。 JAXB将<![CDATA[abcd<>]]>解散为abcd<>。在编组时,它会将内容作为abcd&lt;&gt;放入XML。

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

答案 1 :(得分:1)

唯一的方法是用字符引用"&'<>等替换特殊字符&qout;&amp;

答案 2 :(得分:1)

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

abcd&lt;&gt; instead of `abcd<>`

答案 3 :(得分:1)

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

 public String addCdataTags (String yourString){
        return "<![CDATA[" + yourString + "]]>"
     }

这应该照顾那些错误地被视为xml元素标签的CDATA字符串