:皒祗想自私旳占有著袮
.Net Ajax SQLserver Flex UI JS 一样都不能少...
随笔- 67  文章- 0  评论- 13 
博客园  社区  首页  新随笔  联系  管理  订阅 订阅

当心XML文件中的非法字符(转)

在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文件中的数据,看看是不是用到了什么非法字符。有时候出问题的正是这些小地方。


关于作者:
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同他联系。
posted @ 2008-01-12 12:46 JoyBin 阅读(1026) 评论(0) 编辑 收藏
刷新评论刷新页面返回顶部
程序员问答社区,解决您的IT难题
博客园首页博问新闻闪存程序员招聘知识库
Copyright ©2012 JoyBin