处理java和xml之间的文本转换

时间:2014-01-13 03:11:35

标签: java xml jsp text escaping

我有一个webapp,允许用户在textarea中输入文本,然后按save。

然后将文本保存到xml clob中的数据库中,并通过webapp以html形式显示给用户。

特殊字符存在一些问题。

从文本区域保存到xml时,需要转义以下字符: & < > " '

换行符将正确保存到xml中,但是当它们显示为html时,换行符没有任何效果。

这两个问题都可以通过以下方式解决。

以XML格式保存之前:

//get string from text area
string = string.replaceAll("&", "&amp;"); 
string = string.replaceAll("<", "&lt;"); 
string = string.replaceAll(">", "&gt;"); 
string = string.replaceAll("\"", "&quot;");
string = string.replaceAll("\'", "&apos;");

从xml中获取文字后

//get text from xml
string = string.replaceAll("\n", "<br/>"); 

此解决方案适用于我正在尝试实现的目标。

问题是,为了不重新发明轮子或优雅,是否有更好的或现有的解决方案来解决这类问题?

1 个答案:

答案 0 :(得分:-1)

你走在正确的轨道上。通常,当您创建一个JEE Web应用程序时,您将一个类处理在一个名为ServletUtilities的类中处理此类常规转换的类。在其中,您可以使用静态方法调用,例如“过滤”,并将其传递给String参数。所以,你可以这样:

public class ServletUtilities
{
  public static String filter(String input)
  {
     if(!hasSpecialChars(input))
     {
       StringBuffer filtered = new StringBuffer(input.length());
       char c;
       for(int i=0; i < input.length(); i++)
       {
         c = input.charAt(i);
         switch(c)
         {
           case '<' : filtered.append("&lt;");break;
           case '>' : filtered.append("&gt;");break;
           case '"' : filtered.append("&quot;");break;
           case '&' : filtered.append("&amp;");break;
           //This next one is optional for the new line
           case '\n' : filtered.append("<br>");break;
           default: filtered.append(c);
         }
       }
       return(filtered.toString()); 
     }
  }

  private static Boolean hasSpecialChars(String input)
  {
    boolean flag = false;

    if((input != null) && (input.length() > 0))
    {
       char c;
       for(int i=0; i < input.length(); i++)
       {
         c = input.charAt(i);
         switch(c)
         {
           case '<' : flag = true;break;
           case '>' : flag = true;break;
           case '"' : flag = true;break;
           case '&' : flag = true;break;
           //This next one is optional for the new line
           case '\n' : flag = true;break;
         }
       }
    }
    return flag;
  }
}

希望这有帮助。