Если вы хотите найти интересующий элемент позиционно , используйте общие свойства XML DOM:
In PowerShell Core :
# Extract the text from the *last child* of the *document element*.
# This is the positional equivalent of your $xmlData.note.body call.
# Of course, you can use specific indices such as [2] as well.
$xmlData.DocumentElement.ChildNodes[-1].InnerText
Для вашего образца документа вывод будет Don't forget me this weekend!
, как и ожидалось.
In Windows PowerShell (все обходные пути)работать и в PowerShell Core):
A ошибка не позволяет использовать [-1]
для ссылки на элемент last коллекции вэтот случай.
Обходной путь 1 :
$childNodes = $xmlData.DocumentElement.ChildNodes
$childNodes[$childNodes.Count-1].InnerText
Обходной путь 2 :
Вы предложили следующую альтернативу,что гораздо проще, хотя и менее эффективно (что, вероятно, не имеет значения):
Используйте перечисление членов , чтобы извлечь .InnerText
значения из всех дочерних узлов вверхfront - который возвращает обычный массив PowerShell - и применяет [-1]
к , что :
$xmlData.DocumentElement.ChildNodes.InnerText[-1]
Обходной путь 3 , предложенный Tomalak :
$xmlData.DocumentElement.ChildNodes |
Select-Object -Last 1 -ExpandProperty InnerText
Select-Object -Last 1
удается извлечь последний дочерний элемент, а -ExpandProperty InnerText
затем возвращает значение свойства .InnerText
.
Обратите внимание, что это решение обычно работает хуже всего из обходных путей.из-за использования командлета в конвейере, опять же, это, вероятно, не будет иметь значения на практике, если вы не вызовете этот код в цикле с большим количеством итераций.