【发布时间】:2015-03-25 14:52:32
【问题描述】:
考虑以下简单的XML 字符串:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<example>
<value name="test">abcd</value>
</example>
以下代码定义了 2 个 Java 类(Example.class 和 Value.class),可用于为字符串值 abcd 生成上述 XML 输出:
@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<>或任何其他CDATA字符串,解组器会抛出异常:
org.xml.sax.SAXParseException; The content of elements must consist of well-formed character data or markup.
proposed solution 是使用带有XmlAnyElement 注释的自定义DOMHandler,但它似乎不起作用。
有没有办法将abcd<> 字符串反序列化为文字(即,不将其包含在CDATA 部分中)?
【问题讨论】:
-
您链接到 (blog.bdoughan.com/2011/04/…) 的建议解决方案是将部分未编组的 XML 保留为
String。它仍然要求 XML 有效。