Несколько вещей:
- символы косой черты не должны быть удвоены, например, "/ Employee / EName"
(если между перечисленными узлами не может быть дополнительных узлов)
- первый путь должен быть следующим: "/ Employees / Employee [EName = '" + employeeName + "']";
- второй путь должен быть "ID" (обязательно с учетом регистра)
в текущем locig слишком много GotoParent
по поводу заявления не использовать //, я не уверен, это зависит от схемы XML. Я не понимаю, зачем возвращаться к родителям и т. Д., Может быть, если вы укажете это подробнее, мы сможем разобраться в этом ...
Некоторая моя путаница связана с попыткой повторно использовать текущую логику. По правде говоря, вам понадобится только одна навигационная система XPATH, чтобы получить то, что вам нужно:
"/Employees/Employee[EName="' + employeeName + "']/ID"
Вышеуказанное означает: из корня (одиночная начальная косая черта) найти дочерний элемент, затем его дочерний элемент, имеющий дочерний элемент с именем EName со значением employeeName . Затем получите идентификатор «брат» этого узла EName.
Некоторые мои сомнения, однако, связаны с двойной косой чертой, которая в XPATH означает, что любой узел прошел путь, который не является необходимым, следующий. Если все записи сотрудника не будут соответствовать той, что показана в примере, она может вам понадобиться и, возможно, усложнить часть XPATH, которая получает идентификатор, соответственно.
РЕДАКТИРОВАТЬ: еще одна вещь ... (объясняя, почему вы получаете все значения в файле, а не просто идентификатор для выбранного имени сотрудника)
Вам необходимо вызвать node.MoveNext () , прежде чем использовать свойство XPathNodeIterator Current.
Вкратце раздел, следующий за вызовом navigator.Select (), может выглядеть так:
if (nodes.Count == 0)
{
return ""; // not found !
}
else
{
nodes.MoveNext(); // <<< That was the missing culprit...
retVal = nodes.Current.Value;
}