我正在尝试处理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

07-26 05:39