1. 程式人生 > >java xml 特殊字元處理(dom4j)

java xml 特殊字元處理(dom4j)

XML中共有5個特殊的字元,分別是:&<>“’。如果配置檔案中的注入值包括這些特殊字元,就需要進行特別處理。有兩種解決方法:其一,採用本例中的<![CDATA[ ]]>特殊標籤,將包含特殊字元的字串封裝起來;其二,使用XML轉義序列表示這些特殊的字元,這5個特殊字元所對應XML轉義序列在表4-2中說明: 

Spring在進行XML配置時,如果屬性值包含了一個XML的特殊符號,因此我們特意在屬性值外添加了一個<![CDATA[ ]]>的XML特殊處理標籤,<![CDATA[ ]]>的作用是讓XML解析器將標籤中的字串當作普通的文字對待,以防止某些字串對XML格式造成破壞。來看一個例子: 


XML程式碼:

Java程式碼  收藏程式碼
  1. <bean id="car" class="com.baobaotao.attr.Car">  
  2.     <property name="maxSpeed">  
  3.         <value>200</value>  
  4.     </property>  
  5.     <property name="brand">①  
  6.         <value><![CDATA[紅旗&CA72]]></value>  
  7.     </property>  
  8. </bean>  


如果使用XML轉義序列,我們可以使用以下的配置替換程式碼清單4-10中的配置: 
XML程式碼:
Java程式碼  收藏程式碼
  1. <property name="brand"><value>紅旗&amp;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