【问题标题】:XmlDocument.SelectSingleNode not always working accuratelyXmlDocument.SelectSingleNode 并不总是能正常工作
【发布时间】:2013-11-26 22:24:01
【问题描述】:

我在使用 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 文件被我们的自定义 404 页面在后面的 C# 代码中使用。代码通过在 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 记录迁移到我们的数据库中,然后只查询数据库——除非我在这里的某个地方犯了一个愚蠢的错误。

【问题讨论】:

  • 我已经删除了大部分不相关的代码......请注意,除了错误的属性名称(如答案所说)之外,您还存在 Urls 区分大小写比较的问题 - 除非您关心 url 的大小写我建议在 XML 中搜索之前将它们规范化为一致的大小写,或者更好地使用 LINQ to XML 并使用不区分大小写的比较进行搜索。
  • 感谢您的意见。我的 XML 文档中实际上都是小写字母,但这并不妨碍访问者提供大写字母——我将在提供的 url 上使用 .ToLower() 作为搜索词,以避免区分大小写的不匹配。我将看一下 LINQ to XML;我还没有使用它,但我真的很喜欢 LINQ,所以我会试一试。
  • @AlexeiLevenkov 另外,我实现了您在修剪后的代码示例中显示的“ExtractUrlFrom()”方法。再次感谢!

标签: c# asp.net xml xmldocument selectsinglenode


【解决方案1】:

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

【讨论】:

  • 哇,我不敢相信这是一个如此简单的问题,我忽略了这么久。非常感谢您的快速回复!我在我的 XML 文档中偶尔放置了一些“oldURL”节点,并且在故障排除时完全忘记了区分大小写。我不敢相信我在这么愚蠢的错误上浪费了这么多时间!
【解决方案2】:

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

【讨论】:

  • 感谢您的快速回复。这正是我所需要的。
猜你喜欢
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
  • 2011-08-27
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多