使用Format-Table格式化带有属性的XML节点

时间:2015-05-07 14:04:33

标签: xml powershell powershell-v3.0

Powershell: How to use Format-Table with XML data详细说明了如何使用属性处理XML元素。我的情况就是这个变种。

在大多数情况下,不存在任何属性:

<content type="application/xml">
  <m:properties>
    <d:Title>Vivamus fermentum semper porta</d:Title>

可以使用此代码处理:

...
$properties = $xml.feed.entry.content.properties
$properties | Format-Table -Property @{Label="Title"; Expression={$_.Title}}
...

甚至:

$properties | Format-Table -Property Title

但是,在少数情况下,存在xml:space属性:

<content type="application/xml">
  <m:properties>
    <d:Title xml:space="preserve">Lorem ipsum dolor sit amet </d:Title>

需要此代码:

...
$properties = $xml.feed.entry.content.properties
$properties | Format-Table -Property @{Label="Title"; Expression={$_.Title."#text"}}
...

有没有一种DRYer方法来处理这种情况?

1 个答案:

答案 0 :(得分:0)

我最初想要提出一些更复杂的东西,但如果这符合你的需要,我不需要拔掉头发。我做了一个函数来检查传递的对象。如果该对象包含&#34; #text&#34;属性然后我们返回它。否则只返回传递的对象。

function Get-XMLElementStringData{
    param(
        # In testing could be a string or System.Xml.XmlElement so I do not type this
        $Element
    )

    # Check for the existence of the property. There are other methods but the result is the same. 
    # If($Element."#text"){$Element."#text"} would also work.
    If($Element.PsObject.Properties.Name -contains "#text"){
        $Element."#text"
    } Else {
        $Element
    }
}

有了这个,我就能像这样改变你的输出代码:

$properties | Format-Table @{Label="Title"; Expression={Get-XMLElementStringData $_.Title}}

如果您正在寻找 DRYer 方式,那么我们可能会采用其他方法。