2013-11-26 2 views
0

У меня возникла интересная проблема с C# и последовательным выбором узлов xml.XmlDocument.SelectSingleNode не всегда работает точно

Наш сайт находится в процессе обновления от классического 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 в нашу базу данных и вместо этого просто запрашиваю базу данных - если только я не делаю глупую ошибку где-то здесь.

+1

Я удалил большую часть несвязанного кода ... Обратите внимание, что в дополнение к неправильным именам атрибутов (как говорят ответы) вы сталкиваетесь с чувствительным к регистру сопоставлением URL-адресов - если вам не нравится случай с URL-адресами, я бы рекомендовал нормализовать их до согласованного случая перед поиском в XML или даже лучше использовать LINQ to XML и искать в случае нечувствительного сравнения. –

+0

Благодарим вас за ввод. Я действительно имею все нижеследующие случаи в своем XML-документе, но это не мешает посетителям предоставлять верхний регистр - я буду использовать .ToLower() на url, который я предоставляю в качестве условия поиска, чтобы избежать несоответствий, чувствительных к регистру. Я взгляну на LINQ to XML; Я еще не использовал его, но мне очень нравится LINQ, поэтому я отдам ему все. – Jeremy

+0

@AlexeiLevenkov Кроме того, я применил метод ExtractUrlFrom(), который вы указали в моем примере с обрезанным кодом. Еще раз спасибо! – Jeremy

ответ

3

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

+0

Вау, я не могу поверить, что это была такая простая проблема, и я так долго ее не замечал. Большое вам спасибо за быстрый ответ! У меня было несколько спорадически размещенных узлов «oldURL» в моем XML-документе, и я полностью забыл посмотреть на чувствительность к регистру при устранении неполадок. Не могу поверить, что я потратил столько времени на такую ​​глупую ошибку с моей стороны! – Jeremy

2

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

+0

Спасибо за быстрый ответ. Это было именно то, что мне нужно. – Jeremy

Смежные вопросы