当心XML文件中的非法字符

时间:2022-11-25 17:59:41


在XML文件中有些字符是被禁止使用的。以下技巧会告诉你如何识别它们、它们何时出现以及如何采取相应的措施。
by Jonathan Goodyear
几天前我用过一个在ASP.NET中定义的标准的AdRotator 服务器控件。你也许对AdRotator还不太熟悉,它可以使你在Web网页中随意选取广告(banner)。AdRotator用一个XML文件作为数据源,其结构很简单:

<Advertisements>
  <Ad>
    <ImageUrl>banner.gif</ImageUrl>
    <NavigateUrl>page.aspx</NavigateUrl>
    <AlternateText>Click Here</AlternateText>
    <Impressions>2000</Impressions>
    <Keyword>top_banner_slot</Keyword>          
  </Ad>
</Advertisements>
 

你可以将<Ad>元素添加到文件中使每个广告循环出现。在本文中我想着重介绍一下<NavigatedURl>元素。 如果用AdRotator服务器控件点击一个广告,浏览器便会重新定向到由该元素指定的URL上。这在通常情况下会运行的很好,但这一次我却发现它出错了:

This is an unexpected token. Expected 'SEMICOLON'

这使我花了些功夫去研究这个错误。后来我通过这个ASP.NET页面中显示的出错回溯列表(stack trace)找到了解决这个奇怪错误的线索。和你猜想的一样,.NET Framework的 System.Xml 命名空间下的XmlDocument类会在内部加载广告文件,该文件由AdRotator 服务器控件的AdvertisementFile属性所指定。在加载的过程中它遇到一个使它出错的字符。在检查XML广告文件的时候,我发现在其中一个<NavigateUrl>元素中使用了一个XML的非法字符--一个表示“和”的“&”字符。实际上,在XML文件中被禁止使用的ASCII字符共有五个:

&lt;  < 小于
&gt; > 大于
&amp; &  和
&apos; ' 单引号
&quot; " 双引号

注意尽管“&”字符被用在转义字符序列(escape character sequence)中,但在需要它本身时仍要进行转义(使用转义字串)。同样在C#里如果字符串中包含“\”时需要双写它。这就解释了为什么有时会出现“缺少分号”这一含义模糊的出错信息。所以当XML剖析器在我的<NavigateUrl>元素中找到这个“&”字符时,它就会去找相对应的分号来关闭当前的转义序列,如果找不到就会抛出一个异常。

幸运的是,解决问题的方法只是简单地将<NavigateUrl>元素中的“&”字符用转义序列“&amp;”来代替就可以了。请注意不止是在使用AdRotator服务器控件时会有这个问题,用在.NET的XML文件也可能会出现这个问题。使用以下代码也会产生异常:

XmlDocument d = new XmlDocument();
d.Load(@"c:\ads.xml");
 

它产生的异常和前面在ASP.NET中出现的异常很相似:

An unhandled exception of type 'System.Xml.XmlException' occurred in system.xml.dll Additional information: System error.

因此,如果你的XML解析到一个突发的问题,你不妨检查一下XML文件中的数据,看看是不是用到了什么非法字符。有时候出问题的正是这些小地方。