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 чувствителен к регистру.