Я пытаюсь написать код, чтобы найти конкретный объект 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 всегда имеет значение NULL. Когда я прерываюсь после выполнения метода Load, я вижу все элементы в XML-файле, поэтому он загружается должным образом.
Я пробовал использовать одинарные кавычки в запросе XPath, но это не имело никакого значения.
_siteMapFileName устанавливается в методе Initialize и указывает на правильный файл.
Есть ли у кого-нибудь идеи, что может быть с этим, или предложить другой способ найти конкретный элемент по атрибуту?





Попробуйте добавить «//» в начало вашего запроса XPath, чтобы он соответствовал элементу Любые siteMapNode с правильным URL-адресом, а не только с теми, которые находятся на верхнем уровне.
(Я не знаком с форматом XML карты сайта ASP.NET, поэтому это может не иметь никакого значения ...)
Обновлено: Я предлагаю вам использовать инструмент тестирования XPath (их много - я сам их не использовал, поскольку мне редко нужны выражения XPath). Они позволят вам загрузить документ, а затем покажут, что делает XPath. Это выглядит хорошо, так что это очень странно ...
выглядит хорошо, а вы пробовали использовать xpath, например:
** // ** siteMapNode [@ url = "~ / lev / index.aspx"]
Карта сайта имеет пространство имен по умолчанию, но вы на него не ссылаетесь.
<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);
Файл карты сайта содержит узел «siteMap» верхнего уровня, который может содержать единственный узел «siteMapNode». Этот "siteMapNode" может содержать произвольно глубокое дерево дочерних узлов "siteMapNode".
Хотя добавление «//» гарантирует, что узел найдет совпадения, это небрежная и опасная привычка. Если вы знаете, где в XML-документе можно найти узел, то, как правило, лучше сопоставить более явно.
В этом случае предположим, что нужный вам узел находится на вершине дерева, и вам нужен XPath, вероятно, "siteMap / siteMapNode / siteMapNode [@url = \" ~ / lev / index.aspx \ "]".
Спасибо, что ответили так быстро. Просто попробовал, но он все еще возвращается как нулевой. Пробовал с несколькими URL-адресами в карте сайта, и с каждым я получаю тот же результат.