我正在尝试处理XML文件(下面的片段),在该文件中我已从元素节点中提取了属性。我还想提取 header 值(如果存在),并将其与该“组”的所有类型属性一起返回,但前提是它存在。但是,我不太清楚该怎么做-我可以检索 header 值,但不能弄清楚如何仅与具有 header 值的“组”关联。我确定组是错误的术语,几乎就像我想从父节点获取 header 一样,但是它没有存储在父节点中。
我提供了示例输出,以希望展示我尝试解释的内容。
$xml = [xml]@"
<document document="test">
<elements>
<element type="header">Header1</element>
<element type="link" title="Title1" />
<element type="link" title="Title2" />
<element type="link" title="Title3" />
</elements>
<elements>
<element type="link" title="Title200" />
</elements>
<elements>
<element type="header">Header2</element>
<element type="link" title="Title300" />
<element type="link" title="Title301" />
</elements>
</document>
"@
$objs = @()
$nodes = $xml.SelectNodes("//*[@type]")
foreach ($node in $nodes) {
#$node.ParentNode.ToString()
$type = $node.Attributes['type'].value
if ($type -eq "header") {$header = $node.InnerText}
$title = $node.Attributes['title'].value
$obj = New-Object PSObject -Prop @{TYPE=$type;TITLE=$title;HEADER=$header}
$objs += $obj
}
$header = ""
$objs
我目前得到的输出:
标题标题类型
----- ------ ----
Header1 header
Title1 Header1链接
Title2 Header1链接
Title3 Header1链接
Title200 Header1链接
Header2 header
Title300 Header2链接
Title301 Header2链接
我想要的输出(没有显示
Title200
的 header ):标题标题类型
----- ------ ----
Header1 header
Title1 Header1链接
Title2 Header1链接
Title3 Header1链接
Title200链接
Header2 header
Title300 Header2链接
Title301 Header2链接
最佳答案
您没有在每个$header
传递的beginnig处初始化foreach
变量,这会导致以下事实:先前的值保留在内部。试试这个:
$objs = @()
$nodes = $xml.SelectNodes("//*[@type]")
foreach ($node in $nodes) {
#$node.ParentNode.ToString()
$header = ""
$type = $node.Attributes['type'].value
if ($type -eq "header") {$header = $node.InnerText}
$title = $node.Attributes['title'].value
$obj = New-Object PSObject -Prop @{TYPE=$type;TITLE=$title;HEADER=$header}
$objs += $obj
}
$header = ""
$objs