今天在寫接口查詢SQL時,報了一個異常,如下:
Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 242; 元素內容必須由格式正確的字符數據或標記組成。
經查資料,發現是由於查詢語句中"<"和">"引起的,在mybatis映射文件中直接使用這些運算符會引起解析錯誤,跟標簽沖突。
錯誤部分sql
where ei.no = #{no} and qi.quote_time < pi.pricing_time
解決:用 把 加括號 包裹起來或使用 &<;
正確寫法
where ei.no = #{no} and ==<![CDATA[qi.quote_time < pi.pricing_time]]>
探究XML中CDATA與轉義字符
對於 :
所有 XML 文檔中的文本均會被解析器解析。只有 CDATA 區段(CDATA section)中的文本會被解析器忽略。
轉義字符:
非法的 XML 字符必須被替換為實體引用(entity reference)。
XML 中5 個預定義的實體引用:
嚴格地講,在 XML 中僅有字符 "<"和"&" 是非法的。省略號、引號和大於號是合法的,但是把它們替換為實體引用是個好的習慣。
CDATA 部分不能包含字符串 "]]>"。也不允許嵌套的 CDATA 部分。
標記 CDATA 部分結尾的 "]]>" 不能包含空格或折行。