2016-02-29 50 views
0

我有一個有點問題Java創建XML和使用XSL來創建HTML轉義字符

  1. 用java獲取用戶數據
  2. 使用JAXB
  3. 創建我的XSL模板
  4. 生成XML使用Java生成HTML

現在我有一個問題\r\n和一些其他時髦的象徵LS。我應該用xml escapes還是html escapes解析我的xml的內容。默認的Java轉義工具類正在做一個糟糕的工作,我在網上找到的自定義類也不起作用。

會很好的解決方案是隻需更換\n\r<p> </p>或者什麼html tag將是一個很好的選擇嗎?謝謝!

一個簡單的例子是我的xml中的日期值,它以字符串的形式傳遞並使用了所有的轉義。

原文:(同一時間,我不記得) - Mon, 29 Feb 2016 13:40:58 EST (-0500)

轉義XML條目: - <Date>Mon&amp;#044; 29 Feb 2016 03&amp;#058;40&amp;#058;43 EST&amp;#040;&amp;#045;0500&amp;#041;</Date>

解析的HTML輸出: - Mon&#044; 29 Feb 2016 03&#058;40&#058;43 EST&#040;&#045;0500&#041;

編碼中出現明顯錯誤,d對特殊字符進行編碼。 但是當這種被解析成HTML

編輯:我也有這種垃圾,我甚至不認識是:&#xD;

編輯:我固定日期的問題,但它仍然不是件正確編碼。

public static String entityEncode(String text) { 
    String result = text; 
    if (result == null) 
     return result; 
    return StringEscapeUtils.escapeXml(XMLStringUtil.escapeControlChrs(result)); 
} 

而其他類:

public class XMLStringUtil { 

    private static HashSet<Character> illegalChrSet = new HashSet<>(); 

    static { 
     final String illegalChrs = "\u0000\u0001\u0002\u0003\u0004\u0005" + 
       "\u0006\u0007\u0008\u000B\u000C\u000E\u000F\u0010\u0011\u0012" + 
       "\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C" + 
       "\u001D\u001E\u001F\uFFFE\uFFFF"; 

     for (int i=0; i < illegalChrs.length(); i++) { 
      illegalChrSet.add(illegalChrs.charAt(i)); 
     } 
    } 

    public static String escapeControlChrs(String str) { 
     if (str == null) { 
      return null; 
     } 
     StringBuilder sb = new StringBuilder(str.length()); 
     for (int i=0; i < str.length(); i++) { 
      char chr = str.charAt(i); 
      if (illegalChrSet.contains(chr)) { 
       sb.append("\\x"); 
       sb.append(String.format("%04x", (int) chr)); 
      } else { 
       sb.append(chr); 
      } 
     } 

     return sb.toString(); 
    } 

    public static String removeControlChrs(String str) { 
     if (str == null) { 
      return null; 
     } 
     StringBuilder sb = new StringBuilder(str.length()); 
     for (int i=0; i < str.length(); i++) { 
      char chr = str.charAt(i); 
      if (! illegalChrSet.contains(chr)) { 
       sb.append(chr); 
      } 
     } 

     return sb.toString(); 
    } 

,但我仍然得到這個垃圾中的XML:

<Info>The origin domain used for comparison was: &#xD; 
google.ca.ca&#xD; 
blah blah blah&#xD; 
</Info> 

它發生在新的生產線。

回答

0

問題是當你編碼到xml本身。 HTML正確解析值。對於html &是&。請檢查你是如何編碼爲XML的。 XML不應該包含所有這些ASCII字符。

基本上你的字符串有字符'/'。當編碼時它將被轉換爲用於xml的 。這個 不爲html所知。或者當創建XML替換'/'與/和解碼後的HTML將自動轉換爲'/'

+0

我更新了這個問題,向您展示我現在編碼如何,但仍有一些問題:( – codeCompiler77