[英]Unmarshaling XML CDATA strings as literals using JAXB
考慮以下簡單的XML
字符串:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<example>
<value name="test">abcd</value>
</example>
以下代碼為字符串值abcd
定義了2個Java
類( Example.class
和Value.class
),可用於生成上述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.
一個建議的解決方案是使用帶有XmlAnyElement
批注的自定義DOMHandler
,但似乎不起作用。
有沒有辦法將abcd<>
字符串反序列化為文字(即,不將其包含在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解析器依賴於表示元素標簽的尖括號。 將它們包含在元素內容中時,必須格外小心。
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 version="1.0" encoding="UTF-8" standalone="yes"?>
<example>
<value name="test"><![CDATA[abcd<>]]></value>
</example>
唯一的方法是用字符引用&qout;&
等替換特殊字符"&'<>
我認為您將必須在下面的xml字符串中替換特殊字符。
abcd<> instead of `abcd<>`
您是否嘗試過創建一種在解組之前附加CDATA標記的方法?
public String addCdataTags (String yourString){
return "<![CDATA[" + yourString + "]]>"
}
這應該照顧那些被錯誤地視為xml元素標簽的CDATA字符串
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.