Имея XML-документ, я хочу получить первый узел с определенным именем, независимо от того, в какой глубине вложенности он содержится.
Я несколько раз безуспешно пытался:
var node1 = doc.SelectSingleNode(@"//Shortcut");
var node2 = doc.SelectSingleNode(@"/*/Shortcut");
var node3 = doc.SelectSingleNode(@"//*/Shortcut");
var node4 = doc.SelectSingleNode(@"*/Shortcut");
...
Каждый вызов приводит к узлу NULL
.
Я думаю, что это должен быть какой-то тривиальный синтаксис XPath.Можете ли вы мне помочь?
(Если это имеет значение: XML-документ является входным файлом для проекта WiX , поэтому могут возникнуть некоторые проблемы с пространством имен?!?).
Редактировать
Я также попробовал следующее:
var nsm = new XmlNamespaceManager(doc.NameTable);
nsm.AddNamespace(string.Empty, @"http://schemas.microsoft.com/wix/2006/wi");
nsm.AddNamespace(@"ns", @"http://schemas.microsoft.com/wix/2006/wi");
вместе с:
var node1 = doc.SelectSingleNode(@"//Shortcut", nsm);
var node2 = doc.SelectSingleNode(@"/*/Shortcut", nsm);
var node3 = doc.SelectSingleNode(@"//*/Shortcut", nsm);
var node4 = doc.SelectSingleNode(@"*/Shortcut", nsm);
...
Приводит к тем же результатам.
Редактировать 2 - Решение
Я нашел решение:
var nsm = new XmlNamespaceManager(doc.NameTable);
nsm.AddNamespace(string.Empty, @"http://schemas.microsoft.com/wix/2006/wi");
nsm.AddNamespace(@"ns", @"http://schemas.microsoft.com/wix/2006/wi");
, а затем
var node1 = doc.SelectSingleNode(@"//ns:Shortcut", nsm);
Это успешно.