当心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字符共有五个:
< | < | 小于 |
> | > | 大于 |
& | & | 和 |
' | ' | 单引号 |
" | " | 双引号 |
注意尽管“&”字符被用在转义字符序列(escape character sequence)中,但在需要它本身时仍要进行转义(使用转义字串)。同样在C#里如果字符串中包含“\”时需要双写它。这就解释了为什么有时会出现“缺少分号”这一含义模糊的出错信息。所以当XML剖析器在我的<NavigateUrl>元素中找到这个“&”字符时,它就会去找相对应的分号来关闭当前的转义序列,如果找不到就会抛出一个异常。
幸运的是,解决问题的方法只是简单地将<NavigateUrl>元素中的“&”字符用转义序列“&”来代替就可以了。请注意不止是在使用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文件中的数据,看看是不是用到了什么非法字符。有时候出问题的正是这些小地方。
关于作者:
Jonathan Goodyear是ASPSoft(www.aspsoft.com)的总裁,这是个位于Orlando,Fla.的一家Internet咨询公司。他是位MCSD,是Debugging ASP.NET(New Riders)一书的作者,你可以在www.debuggingasp.net找到它。你可以通过jon@aspsoft.com与他联系,或者通过他在www.angryCoder.com上的angryCoder eZine同他联系。