java xml 特殊字元處理(dom4j)
阿新 • • 發佈:2019-01-25
XML中共有5個特殊的字元,分別是:&<>“’。如果配置檔案中的注入值包括這些特殊字元,就需要進行特別處理。有兩種解決方法:其一,採用本例中的<![CDATA[ ]]>特殊標籤,將包含特殊字元的字串封裝起來;其二,使用XML轉義序列表示這些特殊的字元,這5個特殊字元所對應XML轉義序列在表4-2中說明:
Spring在進行XML配置時,如果屬性值包含了一個XML的特殊符號,因此我們特意在屬性值外添加了一個<![CDATA[ ]]>的XML特殊處理標籤,<![CDATA[ ]]>的作用是讓XML解析器將標籤中的字串當作普通的文字對待,以防止某些字串對XML格式造成破壞。來看一個例子:
XML程式碼:
Java程式碼
- <bean id="car" class="com.baobaotao.attr.Car">
- <property name="maxSpeed">
- <value>200</value>
- </property>
- <property name="brand">①
- <value><![CDATA[紅旗&CA72]]></value>
-
</property>
- </bean>
如果使用XML轉義序列,我們可以使用以下的配置替換程式碼清單4-10中的配置:
XML程式碼:
Java程式碼
- <property name="brand"><value>紅旗&CA72</value></property>
看過很多的部落格包括stackoverflow都是在說xml string內部絕對不能出現幾個特殊字元,要想程式能正確執行必須要轉義或者加CDATA標籤等等,然後就讓手動地轉義好。這不廢話嗎!這些我能不知道麼。
關鍵是假如一個伺服器端處理程式接收到客戶端app請求中有一個xml String 但是使用者沒給特殊字元轉義,同時客戶app更新一次不太容易,咋辦?
我需要剝離出包含轉義字元的屬性或text值。
//escape input string
if(path.contains("title")){
elementStr = getEscapedStr(elementStr,false);
}else if(path.contains("scheduleTurnOff")){
elementStr = getEscapedStr(elementStr,true);
}
private String getEscapedStr(String str,boolean isInAttribute){
String result = new String();
if(!isInAttribute){//case title
int start = str.indexOf('>');
int end = str.lastIndexOf('<');
result = str.substring(0, start+1)+
StringEscapeUtils.escapeXml(str.substring(start+1, end))
+str.substring(end);
}else{//case scheduleturnoff's attibute name
String[] strary = str.split("\"");//通過“號分割xml string
for (int i=0;i<strary.length;i++) {
if(strary[i].equals(" name="))//name屬性中可能會有特殊字元
strary[i+1] = StringEscapeUtils.escapeXml(strary[i+1]);
}
result+=strary[0];
for (int i=1;i<strary.length;i++) {//組合字串
result+="\""+strary[i];
}
}
return result;
}
http://stackoverflow.com/questions/13543102/regular-expression-how-to-match-properties-where-the-value-can-be-of-type-xml