Я думаю, что вы хотите:
myXMLdoc.SelectSingleNode("/itemSet/Item[text()='two']")
Другими словами, вы хотите, чтобы Item имел текст два, а не itemSet
, содержащий его.
Вы также можете использовать одну точку для обозначения узла контекста, в вашем случае:
myXMLdoc.SelectSingleNode("/itemSet/Item[.='two']")
EDIT: Разница между .
и text()
заключается в том, что .
означает «этот узел» эффективно, а text()
означает «все дочерние узлы текстового узла этого узла». В обоих случаях сравнение будет против «строкового значения» LHS. Для узла элемента строковое значение является «объединением строковых значений всех потомков текстового узла узла элемента в порядке документа», а для набора текстовых узлов сравнение будет проверять, равен ли какой-либо текстовый узел тот, с которым ты тестируешь.
Так что не имеет значения, когда содержимое элемента имеет только один текстовый узел, но предположим, что у нас было:
<root>
<item name="first">x<foo/>y</item>
<item name="second">xy<foo/>ab</item>
</root>
Тогда выражение XPath «root/item[.='xy']
» будет соответствовать первому элементу, а «root/item[text()='xy']
» будет соответствовать второму.