我对C#有一个有趣的问题,并且一致地选择xml节点。
我们的网站正在从经典ASP升级到ASP.NET。为了让我们升级过程中访问者的过程更加顺畅,我实施了404重定向,将访问者带到新的.aspx,替换旧的.asp页面以获取外部链接,书签等。
有些链接刚刚从.asp更改为.aspx,但有些更改了结构和命名,所以我有一个遵循这种模式的XML文件:
<?xml version="1.0" encoding="utf-8" ?>
<links>
<link oldUrl="/jailpod/default.asp" newUrl="/about/construction/jailpod.aspx" />
<link oldURL="/boc/boards.asp" newUrl="/boc/boards/default.aspx" />
<link oldUrl="/maps.asp" newUrl="/maps/default.aspx" />
</links>
这个XML文件由后面的C#代码中的自定义404页面使用。代码通过在XML文件中搜索新的URL来查找替换URL,查看页面是否简单地更改为.aspx,最后如果找不到匹配,则在404页面上让访问者知道他们的页面不正确。
这是C#代码:
// Whether or not to display an additional message to the users
bool redirectVisitor = false;
string url = ExtractUrlFrom(Request.Url.ToString());
var doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.Load(Server.MapPath("~/inc/NewUrlDictionary.xml"));
XmlNode urlNode = doc.SelectSingleNode(
string.Format("/links/link[@oldUrl='{0}']", url));
// Check if the node existed or not
if (urlNode != null)
{
url = urlNode.Attributes["newUrl"].Value;
redirectVisitor = true;
}
else
{
....
}
}
这是问题所在。
当我访问时:
mysite / jailpod / default.asp
OR
mysite的/ maps.asp
我按照我的预期重定向。
当我访问时:
mysite的/ BOC / boards.asp
找不到XmlNode,因此404页面告诉我它不存在。我使用断点来介绍C#代码,它正在搜索的URL正好是“/boc/boards.asp”,我甚至使用Visual Studio locals面板来查看XmlDocument对象的内容,它确实确实有一个属性为“/boc/boards.asp”的节点
对于那个节点来说,这不是一个孤立的问题,其中也存在(看似随机的)其他节点。
有谁知道我在这里做错了什么?我正在考虑将所有这些XML记录迁移到我们的数据库中,而只是查询数据库 - 除非我在这里某处犯了一个愚蠢的错误。
答案 0 :(得分:4)
Xml属性区分大小写。你的第二个xml元素中有oldURL而不是oldUrl。
答案 1 :(得分:2)
查看您的源XML文档,oldUrl的属性与您遇到问题的属性具有不同于其他条目的情况。 xpath区分大小写。