簡體   English   中英

使用JAXB將XML CDATA字符串解組為文字

[英]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.classValue.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有效的一種方法是將<替換為&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 version="1.0" encoding="UTF-8" standalone="yes"?>
<example>
    <value name="test"><![CDATA[abcd<>]]></value>
</example>

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

我認為您將必須在下面的xml字符串中替換特殊字符。

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

您是否嘗試過創建一種在解組之前附加CDATA標記的方法?

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

這應該照顧那些被錯誤地視為xml元素標簽的CDATA字符串

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM