作者:Sky
–=====================================
/*
Description : xml中的特殊字符替换
ARGUMENT : p_number 需要替换特殊字符的xml字符串
RETURN : 格式化处理后的字符串
HISTORY :
Vesion Date(YYYY.MM.DD) Author
1.00 2008.07.29 Rongjie Zhang
替换规则:
空格
> >
& & &
" " "
‘ '
©(版权) © ©
®(注册) ® ®
* × ×
÷ ÷ ÷
¥ ¥ ¥
回车换行
*/ –====================================
FUNCTION XML_FORMAT(p_xml IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(p_xml,
‘&’,
‘&;’),
‘’,
‘ >’),
‘"’,
‘"’),
‘ ‘,
‘ ’),
””,
‘'’);
END XML_FORMAT;
注意:由于需要,我只处理了常见的6种特殊字符.
PS:
不合法的XML字符必须被替换为相应的实体。
如果在XML文档中使用类似"<" 的字符, 那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始。所以不应该象下面那样书写代码:
< | < | 小于号 |
> | > | 大于号 |
& | & | 和 |
' | ' | 单引号 |
" | " | 双引号 |
实体必须以符号"&"开头,以符号";"结尾。
注意: 只有"<" 字符和"&"字符对于XML来说是严格禁止使用的。剩下的都是合法的,为了减少出错,使用实体是一个好习惯。
写个函数处理前进行替换 ,或者采集的时候就先处理掉这些特殊字符.
> 和 < 这类字符是XML 标记字符,在 XML 中有特殊的含义。当在 SQL 查询(或 XPath 查询)中指定这些字符时,必须对它们进行适当的编码(也称为实体编码)。下表列出了这些特殊字符并描述了它们的含义。有关更多信息,请参见 XML 1.0 规范 中的 XML 1.0 规范。
特殊字符 特殊含义 实体编码
> 开始标记 >
< 结束标记 <
" 引号 "
' 撇号 '
& "&"符 &
XML 节点中不能包含这些特殊字符,“&”,“<”,“>”,不然解析时此XML会报错,使用时需要对它转换下
=====================================================
下面是一个很简单的过滤特殊字符的函数:
public string FilterSpecial(string str)//特殊字符过滤函数
{
if (str == "") //如果字符串为空,直接返回。
{
return str;
}
else
{
str = str.Replace("'", "");
str = str.Replace("<", "");
str = str.Replace(">", "");
str = str.Replace("%", "");
str = str.Replace("'delete", "");
str = str.Replace("''", "");
str = str.Replace("\\"\\"", "");
str = str.Replace(
str = str.Replace(".", "");
str = str.Replace(">=", "");
str = str.Replace("=<", "");
str = str.Replace("-", "");
str = str.Replace("_", "");
str = str.Replace(";", "");
str = str.Replace("||", "");
str = str.Replace("[", "");
str = str.Replace("]", "");
str = str.Replace("&", "");
str = str.Replace("/", "");
str = str.Replace("-", "");
str = str.Replace("|", "");
str = str.Replace("?", "");
str = str.Replace(">?", "");
str = str.Replace("?<", "");
str = str.Replace(" ", "");
return str;
}
}
更高效率的办法
public string UrnHtml(string strHtml)
{
string[] aryReg ={ "'", "<", ">", "%
for (int i = 0; i < aryReg.Length; i++)
{
strHtml = strHtml.Replace(aryReg[i], string.Empty);
}
return strHtml;
}
================================
其中一项就是一个页面出现错误,不能正常显示,查看了一下原因,发现是公司名中的特殊字符&在作祟。原来xml中会自动转义<>&这些特殊字符,为了保证xml能显示这些特殊字符,必须将它们转为< > &
幸好,C#中本身提供了方法可以帮助我们轻松进行转换,只需要调用String System.Security.SecurityElement.Escape(String s)静态方法就可以了,OK,封装在我们自己的XmlHelper中,就成了我们自己的工具类啦:)
后来发现,为什么有一些xml我们没有对特殊字符进行转换,但是它却没有报错呢?原来使用了C#的System.Xml命名空间下的XmlTextWriter,它会自动为&这些特殊符号进行特殊字符转换,无需我们手工代劳了。
FUNCTION replacespecialchar(ov_source VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(ov_source,
'&',
'&' || 'amp;'),
'<',
'&' || 'lt;'),
'>',
'&' || 'gt;'),
'"',
'&' || 'quot;'),
'''',
'&' || 'apos;');
END;