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-файл используется нашей пользовательской страницей 404 в коде C#. Код проходит процесс поиска заменяющего URL-адреса путем поиска нового в XML-файле, проверяя, не была ли страница просто изменена на.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 / ВОС / boards.asp

XmlNode не найден, и поэтому страница 404 просто говорит мне, что его не существует. Я прошел через код C#, используя точку останова, и URL-адрес, который он ищет, является в точности "/boc/boards.asp", и я даже использовал панель локали Visual Studio для просмотра содержимого объекта XmlDocument, и он делает действительно есть узел с атрибутом "/boc/boards.asp"

Это не единичная проблема с этим одним узлом, есть (казалось бы, случайные) другие узлы, где это происходит.

Кто-нибудь знает, что я здесь делаю не так? Я подумываю просто перенести все эти записи XML в нашу базу данных и просто запросить базу данных вместо этого - если только я не совершу глупую ошибку где-то здесь.

2 ответа

Решение

Атрибуты XML чувствительны к регистру. У вас есть oldURL вместо oldUrl во втором элементе xml.

Посмотрите на исходный XML-документ, атрибут oldUrl для того, с чем у вас проблема, отличается от других записей. xpath чувствителен к регистру.

Другие вопросы по тегам