Поиск XmlNode по атрибуту в ASP.net

Я пытаюсь написать некоторый код, чтобы найти конкретный объект XmlNode на основе URL-адреса в XML-карте сайта, но не могу его найти.

Карта сайта является стандартной картой сайта ASP.net и содержит:

<siteMapNode url="~/lev/index.aspx" title="Live-Eye-Views">
--- Child Items ---
</siteMapNode>

Код, который я использую для поиска элемента:

XmlDocument siteMapXml = new XmlDocument();
siteMapXml.Load(AppDomain.CurrentDomain.BaseDirectory + _siteMapFileName)
XmlNode levRoot = siteMapXml.SelectSingleNode("siteMapNode[@url=\"~/lev/index.aspx\"]");

Объект levRoot всегда нулевой. Когда я ломаюсь после метода Load, я вижу все элементы в файле XML, поэтому он загружается, как и ожидалось.

Я пытался использовать одинарные кавычки в запросе XPath, но это не имело никакого значения.

_siteMapFileName устанавливается в методе Initialize и указывает на правильный файл.

У кого-нибудь есть идеи, что может быть с этим, или предложить другой способ найти определенный элемент по атрибуту?

15.12.2008 12:07:10
4 ОТВЕТА
РЕШЕНИЕ

Карта сайта имеет пространство имен по умолчанию, но вы не ссылаетесь на него.

<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/lev/index.aspx" title="Live-Eye-Views">
    <!-- Child Items -->
  </siteMapNode>
</siteMap>

Итак, вы должны использовать это:

XmlNamespaceManager nsmgr = new XmlNamespaceManager(siteMapXml.NameTable);
nsmgr.AddNamespace("smap", "http://schemas.microsoft.com/AspNet/SiteMap-File-1.0");
string xpath = "//smap:siteMapNode[@url=\"{1}\"]";
string url = "~/lev/index.aspx";
XmlNode levRoot = siteMapXml.SelectSingleNode(String.Format(xpath, url), nsmgr);
2
15.12.2008 12:37:54

Попробуйте добавить «//» в начало вашего запроса XPath, чтобы он соответствовал любому элементу siteMapNode с правильным URL-адресом, а не только элементу верхнего уровня.

(Я не знаком с форматом XML карты сайта ASP.NET, поэтому это может не иметь никакого значения ...)

РЕДАКТИРОВАТЬ: я предлагаю вам использовать инструмент тестирования XPath (есть много вокруг - я сам не использовал их, так как мне редко нужны выражения XPath). Они позволят вам загрузить ваш документ, а затем покажут вам, что делает XPath. Это выглядит хорошо, так что это очень странно ...

1
15.12.2008 12:36:39
Спасибо за быстрый ответ. Просто попробовал, но все равно возвращается как ноль. Пробовал с несколькими URL в карте сайта, и я получаю одинаковый результат с каждым.
Kevin Wilson 15.12.2008 12:26:42

выглядит хорошо afaik, вы пробовали использовать xpath вроде:

** // ** SiteMapNode [@ URL = "~ / лева / index.aspx"]

0
15.12.2008 12:12:45

Файл карты сайта содержит узел «siteMap» верхнего уровня, который может содержать один узел «siteMapNode». Этот siteMapNode может содержать произвольно глубокое дерево дочерних узлов siteMapNode.

Хотя добавление «//» гарантирует, что узел получает совпадения, это небрежная и опасная привычка. Если вы знаете, где в документе XML может быть найден узел, то обычно лучше сопоставить более явно.

В этом случае предположим, что нужный вам узел находится на вершине дерева, а нужный вам XPath - это, вероятно, "siteMap / siteMapNode / siteMapNode [@url = \" ~ / lev / index.aspx \ "]" .

0
15.12.2008 18:04:17