在XML中,有一些符號作為XML 的標記符號,一些特定情況下,屬性值必須帶有這些特殊符號。 下面主要是講解一些常用的特殊符號的處理
例一: 雙引號的使用。
雙引號作為XML 屬性值的開始結束符號,因此無法在值中直接使用"". 處理方式可以分為兩種。
a: 屬性值中沒有'(單引號) ,那麼可以用單引號'' 作為屬性值的開始結束符號
<add key="IPhone" value="apple"/> ...屬性值為 ("apple").
解決: <add key="IPhone" value=’"apple"‘/>
b: 屬性值中有'(單引號) ,也有雙引號。 如...屬性值為 ("'apple").
<add key="IPhone" value=""'apple""/>
下表為 XML 標記使用的字元列出了五種內建實體。
實體 |
實體引用 |
含義 |
lt |
< |
<(小於符號) |
gt |
> |
>(大於符號) |
amp |
& |
&(“and”符) |
apos |
' |
'(撇號或單引號) |
quot |
" |
"(雙引號) |
如果字元可能會使 XML 分析器錯誤地解釋文檔結構,請使用實體,而不要鍵入字元。' 和 " 實體引用最常用在屬性值中。
在做WebServices時為了實現複雜資料的傳輸,我們經常會採用XML格式的字串來傳送,這主要是由於XML具有存取資料,跨平台及跨語言等好處。請看下面例子:
public String getAllNewSpace() {
StringBuffer toClient = new StringBuffer("<root>");
if (null != dataset) {
while (dataset.next()) {
toClient.append("<User>");
toClient.append("<UserName>"); //<![CDATA[
toClient.append(dataset.getString(1));
toClient.append("</UserName>"); //]]
toClient.append("<UserId>");
toClient.append(dataset.getString(2));
toClient.append("</UserId>");
toClient.append("</User>");
}
}
toClient.append("</root>");
return toClient.toString();
}
如果<UserName>節點中含有“&”,“<”,“>”等字元時,解釋此XML時會出錯。
可以有兩種解決方案:
一、 通過Xml Document對象得到XML字串返回給用戶端,不能直接把XmlDocument返回給用戶端,因為Java中的Xml Document對象,別的語言是無法正確解釋的,我們只能返回XML 字串:
public String getAllNewSpace() {
Document document = DocumentHelper.createDocument();
Element root=document.addElement("root");
if (null != dataset) {
while (dataset.next()) {
Element user=root.addElement("User");
Element userName=user.addElement("UserName");
userName.setText(dataset.getString(1));
Element userId=user.addElement("UserId");
userId.setText (dataset.getString(2));
}
}
return document.asXML();
}
二、 給XML 字串添加DTD驗證:在節點值部份添加“<![CDATA[ ]]”
public String getAllNewSpace() {
StringBuffer toClient = new StringBuffer("<root>");
if (null != dataset) {
while (dataset.next()) {
toClient.append("<User>");
toClient.append("<UserName><![CDATA[");
toClient.append(dataset.getString(1));
toClient.append("]]</UserName>");
toClient.append("<UserId>");
toClient.append(dataset.getString(2));
toClient.append("</UserId>");
toClient.append("</User>");
}
}
toClient.append("</root>");
return toClient.toString();
}
寫ajax時最容易輸出xml的就是拼湊字串拉
如何處理特殊字元串是個問題
參見以下兩種方法
http://webdev.csdn.net/page/96ba432b-af4a-412c-9684-2935c617faeb
對如我而言,我需要在html頁面上顯示的,我只需要把特殊字元串轉為實體字元
< |
< |
小於符號 |
> |
> |
大於符號 |
& |
& |
和 |
' |
' |
單引號 |
" |
" |
雙引號 |
很顯然 struts標籤 bean:write 的屬性 filter="true" 也是實現此功能
開啟原始碼,輕鬆找到這個方法 org.apache.struts.util。ResponseUtils.filter(String value)
具體實現如下:
public static String filter(String value)
{
if(value == null)
return null;
char content[] = new char[value.length()];
value.getChars(0, value.length(), content, 0);
StringBuffer result = new StringBuffer(content.length + 50);
for(int i = 0; i < content.length; i++)
switch(content[i])
{
case 60: // '<'
result.append("<");
break;
case 62: // '>'
result.append(">");
break;
case 38: // '&'
result.append("&");
break;
case 34: // '"'
result.append(""");
break;
case 39: // '\''
result.append("'");
break;
default:
result.append(content[i]);
break;
}
return result.toString();
}
當然有時候寫javascript還需要平湊html,然後用一句 obj.innerHTML=展示你的頁面
這時候也需要處理特殊字元。
我也仿照bean:write標籤寫很土的一個js版本的filter方法吧
function filter(v)
{
if(v == null||v=="")
return "";
var result="";
for(var i = 0; i < v.length; i++)
switch(v.charAt(i))
{
case "<": result+="<";break;
case ">": result+=">"; break;
case "&":result+="&";break;
case "\"": result+=""";break;
case "'": result+="'";break;
default:result+=v.charAt(i);break;
}
return result;
}
如果用到prototype架構裡面也有個方法
escapeHTML: function() {
return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
}
轉換回來的對應方法為unescapeHTML
例如
var temp="<>/";
alert(temp.escapeHTML());