Ответ 1
Ведущий //
всегда начинается с корня документа; используйте .//
, чтобы начать с текущего node и искать только его потомков:
XmlNode lastnameNode = myNode.SelectSingleNode(".//LastName");
Я хочу ограничить поиск дочернего элемента node, находящегося в текущем node, на котором я включен. Например, у меня есть следующий код:
XmlNodeList myNodes = xmlDoc.DocumentElement.SelectNodes("//Books");
foreach (XmlNode myNode in myNodes)
{
string lastName = "";
XmlNode lastnameNode = myNode.SelectSingleNode("//LastName");
if (lastnameNode != null)
{
lastName = lastnameNode.InnerText;
}
}
Я хочу, чтобы элемент LastName искался из текущего myNode внутри foreach. Случается, что найденное LastName всегда с первого node с myNodes. Я не хочу жестко указывать точный путь для LastName, но вместо этого позволяю ему быть гибким относительно того, где внутри myNode он будет найден. Я бы подумал, что использование метода SelectSingleNode на myNode ограничило бы поиск только содержимым xml myNode и не включало бы родительские узлы.
Ведущий //
всегда начинается с корня документа; используйте .//
, чтобы начать с текущего node и искать только его потомков:
XmlNode lastnameNode = myNode.SelectSingleNode(".//LastName");
Собственно, проблема связана с XPath. синтаксис XPath//означает, что вы выбираете узлы в документе из текущего node, которые соответствуют выбору независимо от того, где они находятся
так что все, что вам нужно, это изменить его на
myNode.SelectSingleNode(".LastName")