XmlDocument.SelectSingleNode并不总是准确地工作

时间:2013-11-26 22:24:01

标签: c# asp.net xml xmldocument selectsinglenode

我对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记录迁移到我们的数据库中,而只是查询数据库 - 除非我在这里某处犯了一个愚蠢的错误。

2 个答案:

答案 0 :(得分:4)

Xml属性区分大小写。你的第二个xml元素中有oldURL而不是oldUrl。

答案 1 :(得分:2)

查看您的源XML文档,oldUrl的属性与您遇到问题的属性具有不同于其他条目的情况。 xpath区分大小写。