C# XmlDocument.SelectSingleNode不总是准确工作

C# XmlDocument.SelectSingleNode不总是准确工作,c#,asp.net,xml,xmldocument,selectsinglenode,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=

我对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>
问题就在这里

当我访问时:

mysite/jailpod/default.asp

mysite/maps.asp

正如我所期望的那样,我被重新引导了方向

当我访问时:

mysite/boc/boards.asp

没有找到XmlNode,因此404页面只是告诉我它不存在。我已经使用断点遍历了C#代码,它正在搜索的URL正好是“/boc/boards.asp”,我甚至使用Visual Studio本地面板查看了XmlDocument对象的内容,它确实有一个属性为“/boc/boards.asp”的节点

这不是一个孤立的问题,一个节点,还有(看似随机的)其他节点


有人知道我做错了什么吗?我正在考虑将所有这些XML记录迁移到我们的数据库中,而只是查询数据库——除非我在这里犯了一个愚蠢的错误

Xml属性区分大小写。在第二个xml元素中使用了oldURL而不是oldURL。

xml属性区分大小写。您在第二个xml元素中使用了oldURL而不是oldURL。

查看源xml文档,您遇到问题的文档的oldURL属性的大小写与其他条目不同。xpath区分大小写。

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

哇,我不敢相信这是一个如此简单的问题,我忽略了它这么久。非常感谢您的快速回复!我在XML文档中偶尔放置了几个“oldURL”节点,在排除故障时,我完全忘记了区分大小写。我真不敢相信我在我这方面犯了这么愚蠢的错误,浪费了这么多时间!哇,我不敢相信这是一个如此简单的问题,我忽略了这么久。非常感谢您的快速回复!我在XML文档中偶尔放置了几个“oldURL”节点,在排除故障时,我完全忘记了区分大小写。我真不敢相信我在我这方面犯了这么愚蠢的错误,浪费了这么多时间!谢谢你的快速回复。这正是我需要的。谢谢你的快速回复。这正是我需要的。我删除了大部分不相关的代码。。。请注意,除了错误的属性名称(正如答案所说)之外,您还存在URL区分大小写比较的问题-除非您关心URL的大小写,否则我建议在使用XML搜索之前将它们规范化为一致的大小写,或者更好地使用LINQ to XML并使用不区分大小写的比较进行搜索。感谢您的输入。实际上,我的XML文档中有所有小写字母,但这并不妨碍访问者提供大写字母——我将在我提供的url上使用.ToLower()作为搜索词,以避免区分大小写的不匹配。我将看一看LINQ到XML;我还没有用过它,但我真的很喜欢LINQ,所以我要试一试。@AlexeiLevenkov同样,我实现了“ExtractUrlFrom()”方法,您在我的修剪代码示例中展示了这个方法。再次感谢!我已经删除了大部分不相关的代码。。。请注意,除了错误的属性名称(正如答案所说)之外,您还存在URL区分大小写比较的问题-除非您关心URL的大小写,否则我建议在使用XML搜索之前将它们规范化为一致的大小写,或者更好地使用LINQ to XML并使用不区分大小写的比较进行搜索。感谢您的输入。实际上,我的XML文档中有所有小写字母,但这并不妨碍访问者提供大写字母——我将在我提供的url上使用.ToLower()作为搜索词,以避免区分大小写的不匹配。我将看一看LINQ到XML;我还没有用过它,但我真的很喜欢LINQ,所以我要试一试。@AlexeiLevenkov同样,我实现了“ExtractUrlFrom()”方法,您在我的修剪代码示例中展示了这个方法。再次感谢!
    // 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
            {
               ....
            }
        }