考虑以下简单的XML
字符串:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<example>
<value name="test">abcd</value>
</example>
以下代码定义了2个Java
类(Example.class
和Value.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<>
部分中)?
答案 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有效的一种方法是将<
替换为<
,将>
替换为>
。您的JAXB实现会将XML值abcd<>
解组为String
值abcd<>
。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<example>
<value name="test">abcd<></value>
</example>
使用字符数据生效
使XML有效的另一种方法是将字符内容包装在CDATA块中。 JAXB将<![CDATA[abcd<>]]>
解散为abcd<>
。在编组时,它会将内容作为abcd<>
放入XML。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<example>
<value name="test"><![CDATA[abcd<>]]></value>
</example>
答案 1 :(得分:1)
唯一的方法是用字符引用"&'<>
等替换特殊字符&qout;&
答案 2 :(得分:1)
我认为你必须将xml字符串中的特殊字符替换为下面的字符。
abcd<> instead of `abcd<>`
答案 3 :(得分:1)
您是否尝试过在解组之前创建附加CDATA标记的方法?
public String addCdataTags (String yourString){
return "<![CDATA[" + yourString + "]]>"
}
这应该照顾那些错误地被视为xml元素标签的CDATA字符串