РЕДАКТИРОВАТЬ , как отмечает @Gaim, моей исходной версии не удалось захватить терминал dt
string xml = @"
<root>
<dt>name</dt>
<dd>value</dd>
<dt>name2</dt>
<dt>name3</dt>
<dd>value3</dd>
<dt>name4</dt>
<dt>name5</dt>
<dd>value5</dd>
<dt>name6</dt>
</root>
";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
XmlNodeList nodes =
doc.SelectNodes("//dt[not(following-sibling::*[1][self::dd])]");
foreach (XmlNode node in nodes)
{
Console.WriteLine(node.OuterXml);
}
Console.ReadLine();
Вывод - это те dt
узлы, у которых нет dd
, следующих непосредственно за ними:
<dt>name2</dt>
<dt>name4</dt>
<dt>name6</dt>
То, что мы здесь делаем, говорит:
//dt
Все dt
узлы, где угодно ....
[not(following-sibling::*[1]
.... такой, что не тот случай, когда их первый следующий брат (как его там называют) ....
[self::dd]]
... называется dd
.