我有一个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
,输出就不会出现错误。如果以表格列形式出现也会更好。
答案 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
。