XML 特殊字元處理

來源:互聯網
上載者:User

在XML中,有一些符號作為XML 的標記符號,一些特定情況下,屬性值必須帶有這些特殊符號。 下面主要是講解一些常用的特殊符號的處理

例一: 雙引號的使用。

雙引號作為XML 屬性值的開始結束符號,因此無法在值中直接使用"". 處理方式可以分為兩種。

a: 屬性值中沒有'(單引號) ,那麼可以用單引號'' 作為屬性值的開始結束符號

<add key="IPhone" value="apple"/>  ...屬性值為 ("apple").

解決:  <add key="IPhone" value=’"apple"‘/>

b: 屬性值中有'(單引號) ,也有雙引號。 如...屬性值為 ("'apple").

<add key="IPhone" value="&quot;&apos;apple&quot;"/> 

下表為 XML 標記使用的字元列出了五種內建實體。

實體 實體引用 含義

lt

&lt;

<(小於符號)

gt

&gt;

>(大於符號)

amp

&amp;

&(“and”符)

apos

&apos;

'(撇號或單引號)

quot

&quot;

"(雙引號)

如果字元可能會使 XML 分析器錯誤地解釋文檔結構,請使用實體,而不要鍵入字元。&apos; 和 &quot; 實體引用最常用在屬性值中。

 

在做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頁面上顯示的,我只需要把特殊字元串轉為實體字元

&lt; < 小於符號
&gt; > 大於符號
&amp; &
&apos; ' 單引號
&quot; " 雙引號

很顯然 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("&lt;");
                break;

            case 62: // '>'
                result.append("&gt;");
                break;

            case 38: // '&'
                result.append("&amp;");
                break;

            case 34: // '"'
                result.append("&quot;");
                break;

            case 39: // '\''
                result.append("&#39;");
                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+="&lt;";break;
            case ">": result+="&gt;"; break;
            case "&":result+="&amp;";break;
            case "\"": result+="&quot;";break;
            case "'": result+="&#39;";break;
            default:result+=v.charAt(i);break;
            }
        return result;
}

如果用到prototype架構裡面也有個方法

escapeHTML: function() {
    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
  }

轉換回來的對應方法為unescapeHTML

例如

var temp="<>/";

alert(temp.escapeHTML());

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.