【问题标题】:Calculate number of lines using XML attributes values使用 XML 属性值计算行数
【发布时间】:2016-07-21 05:08:02
【问题描述】:

我有一个 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 文件并给出计算每个 XML 属性标签的总行数 (TL = AL + DL + CL),并仅列出缺陷“主要”等于是。

这是我尝试过的:

$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 $lines added
添加行
------------
68
86
34
18

但是如果我给echo $totalchangedlines,输出不会正确。最好放在表格列中。

【问题讨论】:

  • 输出应该是单独的 TL 和缺陷计数(基于主要)
  • 欢迎来到 StackOverflow!这不是脚本编写服务。到目前为止,您尝试过什么?
  • 请更新原始问题(使用edit link),不要在cmets中发布代码:)
  • 嗨 Jessen,谢谢,我是新手...我已经更新了我尝试过的内容
  • 这里是一个起点[xml]$xmlfile = Get-Content C:\Cdb\Cdb.xml 然后你可以浏览那个xml对象。

标签: xml powershell powershell-3.0


【解决方案1】:

我不太清楚你最终想要实现什么,但你肯定需要在你发布的代码中修复几个问题。

  • 首先:丢失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,如果您想要检查该列表是否包含字符串 "Yes",请将 -eq 更改为 -contains

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

  • 您是要累积行数还是仅按工件列出行数?
  • 什么是将$major 转换为整数并将其添加到0 应该实现?你的意思是增加$majnumber?在这种情况下,只需使用 $majnumber++
  • 如果至少有一个主要值为“是”,是否应该增加数字?如果所有主要值都是“是”?是否应该为每个“是”的主要值增加它?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 2018-12-12
    • 2017-04-13
    相关资源
    最近更新 更多