使用XML属性值计算行数

时间:2016-04-01 11:46:28

标签: xml powershell powershell-v3.0

我有一个xml文件,如下所示,

<data>
     <fields>
          <artifacts>
              <artifact AL="68" CL="4" DL="0">
              </artifact>
              <artifact AL="86" CL="2" DL="1">
              </artifact>
              <artifact AL="34" CL="7" DL="0">
              </artifact>
              <artifact AL="18" CL="1" DL="3">
              </artifact>
          </artifacts>
          <dart>
              <bug>
                 <fields part="Major">Yes</fields>
                 <fields part="Major">Yes</fields>
                 <fields part="Major">No</fields>
              </bug>
          </dart>
     </fields>
</data>

我希望PowerShell读取XML文件,并给出总计行(TL = AL + DL + CL)计算每个XML atrifact标签并仅列出缺陷“Major”等于是。

这就是我的尝试:

$xmlfile = Get-Content C:\Cdb\Cdb.xml
foreach($line in $xmlfile)
{
    [xml]$xml = Get-Content $line
    $linesadded = $xml.data.fields.artifacts.artifact | Select AL
    $lineschanged = $xml.data.fields.artifacts.artifact | Select CL
    $linesdeleted = $xml.data.fields.artifacts.artifact | Select AL
    $totalchangedlines = "$linesadded't$lineschanged't$linesdeleted";
    echo $totalchangedlines
    <#echo $linesadded#>
    $major = $xml.data.fields.dart.bug.fields
    $majnumber = 0;
    if ($major -eq "Yes")
    {
        $majnumber += [int]$major; 
    }
}

如果我使用

,结果将在下面一行显示
PS> echo $linesadded
lines-added
-----------
68
86
34
18

但如果我给echo $totalchangedlines,输出就不会出现错误。如果以表格列形式出现也会更好。

1 个答案:

答案 0 :(得分:0)

我不太清楚你最终想要达到的目标,但你肯定需要在你发布的代码中解决几个问题。

  • 首先:丢失foreach循环。您不希望单独处理XML文件的每一行。 [xml]$xml = Get-Content C:\Cdb\Cdb.xml会将整个文件读入一个XML对象。
  • $linesdeleted = $xml.data.fields.artifacts.artifact | Select AL:最有可能是DL
  • 如果您希望每个属性位于单独的列表中,请使用Select-Object -Expand而不是Select-Object。如果您希望表格形式的所有工件的属性使用Select-Object AL, CL, DL而不是将它们选择为单个变量。
  • $major = $xml.data.fields.dart.bug.fields生成XML节点列表。它们永远不会等于字符串"Yes"。如果要列出XML节点的值列表,请添加.#text,如果要检查该列表是否包含字符串-eq,请添加-contains。{ / LI>

话虽如此,有些事情需要澄清:

  • 您想累积线条还是只列出每件神器?
  • 什么是将"Yes"转换为整数并将其添加到0应该实现?你的意思是增加$major吗?在这种情况下,只需使用$majnumber
  • 如果至少有一个主要值是“是”,那么该数字是否会递增?如果所有主要值都是“是”?是否应该为每个主要值增加“是”?