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

使用Format Table格式化具有属性的XML节点,xml,powershell,powershell-3.0,Xml,Powershell,Powershell 3.0,详细说明如何使用属性处理XML元素。我的情况是这种情况的一种变化 在大多数情况下,不存在属性: <content type="application/xml"> <m:properties> <d:Title>Vivamus fermentum semper porta</d:Title> <content type="application/xml"> <m:properties> <d:T

详细说明如何使用属性处理XML元素。我的情况是这种情况的一种变化

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

<content type="application/xml">
  <m:properties>
    <d:Title>Vivamus fermentum semper porta</d:Title>
<content type="application/xml">
  <m:properties>
    <d:Title xml:space="preserve">Lorem ipsum dolor sit amet </d:Title>
甚至:

$properties | Format-Table -Property Title
但是,在少数情况下,会出现
xml:space
属性:

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

有没有干燥剂来处理这种情况?

我最初想想出一些更复杂的方法,但如果这符合你的需要,我就不需要拔头发了。我做了一个函数来检查传递的对象。如果该对象包含“
#text
”属性,那么我们将返回它。否则只返回传递的对象

函数获取XMLElementStringData{
param(
#在测试中,可以是字符串或System.Xml.XmlElement,所以我不键入此项
$Element
)
#检查属性是否存在。有其他方法,但结果相同。
#如果($Element.#text){$Element.#text}也可以工作。
If($Element.PsObject.Properties.Name-包含“#text”){
$Element.“#文本”
}否则{
$Element
}
}
有了它,我可以像这样更改您的输出代码:

$properties | Format Table@{Label=“Title”表达式={Get-XMLElementStringData$|.Title}

如果你正在寻找一种更干燥的方法,那么也许我们可以研究另一种方法

我想我有一个想法,但你可以包括一个样本,有两个差异,你是指测试。因为你的第二个片段与第一个非常相似。我更新了我的问题@Matt。