Чтобы получить значение элемента XML в powershell, мы можем просто записать путь, обрабатывая элементы, как если бы они были свойствами объекта PowerShell; то есть $xml.RootElement.ChildElement.GrandChild
.
Однако, если интересующий нас элемент имеет связанный атрибут, чтобы получить текстовое значение, нам нужно перейти к текстовому узлу; то есть $xml.RootElement.ChildElement.GrandChild.'#text'
.
К сожалению, когда у элемента нет атрибута, мы не можем использовать текстовый узел; т. е. в этом сценарии $xml.RootElement.ChildElement.GrandChild.'#text'
не работает.
Clear-Host
$example = [xml](@"
<demo>
<element attribute='1'>10</element>
<element>20</element>
</demo>
"@)
"just the element"
$example.demo.element
"element's text"
$example.demo.element.'#text'
Я написал неприятный обходной путь для этого, но подозреваю, что это неправильный подход / что у PowerShell есть более элегантный способ решить эту проблему.
Мой неприятный обходной путь:
function Get-TextNode {
[CmdletBinding()]
param (
[Parameter(ValueFromPipeline = $true)]
$xmlElement
)
process {
if($xmlElement.Attributes.Count -eq 0) {
$xmlElement
} else {
$xmlElement.'#text'
}
}
}
$example.demo.element | Get-TextNode
$xmlElement.GetType()
к моей команде показывает, что тип элемента изменяется в зависимости от того, присутствуют ли какие-либо атрибуты; то есть если они есть тоXmlElement
, если нет тоString
.. - person JohnLBevan   schedule 03.10.2016