0

我在 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>

我们在 C# 代码中的自定义 404 页面使用此 XML 文件。代码通过在 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

或者

mysite/maps.asp

如我所料,我被重定向了。

当我访问时:

mysite/boc/boards.asp

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

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

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

4

2 回答 2

4

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

于 2013-11-26T22:26:16.333 回答
2

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

于 2013-11-26T22:28:42.310 回答