使用Powershell是否可以在从多个相同标签收集的XML数据之间添加分隔符?

时间:2019-04-09 18:07:37

标签: xml rest powershell xml-parsing

我最近开始为一家新公司工作,他们的先前技术创建了一个Powershell脚本,该脚本旨在从云表单软件的REST API中提取XML数据。它从API中提取相关数据,并将其转换为可读的元数据CSV,以附加到我们使用的内部文件管理软件的ADI导入的文件中。我了解该脚本的工作原理,并且与以前的表单一样运行良好。问题在于一种新表单,该表单旨在在一个响应中包含多个条目。如果在此表单中添加了多个条目,则脚本不会将数据携带到CSV中。

我是Powershell的新手,不知道该从哪里开始解决此问题。

我试图删除XML中除最相关的部分之外的所有部分,以用作我正在使用的示例,从而对整个XML结构进行了相当大的更改。这是两个XML数据示例:

  1. 可转换为CSV的数据示例
<Submission Id="1">
  <Form Id="1">
    <Name>Example 1</Name>
  </Form>
  <Section>
    <Name>Projected Completion Dates</Name>
    <Responses>
      <Response Guid="30547A781493817AA0BDBE7C5C6F949A6292FC92">
        <Label>Projected Completion Dates</Label>
        <Value>04/08/2019</Value>
        <Type>Date</Type>
      </Response>
    </Responses>
  </Section>
</Submission>
  1. 不包含在CSV中的数据示例
<Submission Id="2">
  <Form Id="2">
    <Name>Example 2</Name>
  </Form>
  <Section>
    <Name>Completion Dates</Name>
    <Responses>
      <Responses Entry="Completion Dates">
        <Response Guid="5151F9FC73A03E31B971F38D42CD5300CD6F3C2F">
          <Label>Completion Dates</Label>
          <Value>04/19/2019</Value>
          <Type>Date</Type>
        </Response>
        <Response Guid="5151F9FC73A03E31B971F38D42CD5300CD6F3C2F">
          <Label>Completion Dates</Label>
          <Value>04/26/2019</Value>
          <Type>Date</Type>
        </Response>
      </Responses>
    </Responses>
  </Section>
</Submission>

如果需要,我可以提供整个脚本,但是我将尝试将Powershell代码修改为与XML数据解析相关的内容。

        #PARSE XML DATA TO OBJECT
        $responses = $parsedXML.SelectNodes("/CanvasResult/Submissions/Submission/Sections/Section/Screens/Screen/Responses/Response") 

        #CREATE OBJECT THAT MARRIES GOCANVAS XML DATA W/ FILEHOLD METADATA
        $objMarry = New-Object -TypeName PSObject

        #DYNAMICALLY MARRY LOCAL XML VALUES AND GOCAVNAS API VALUES
        foreach ($GCValue in $obj.value){

            $objMarry | Add-Member -Type noteProperty `
            -Name $GCValue `
            -Value ($responses | Where-Object {$_.Label -eq $GCValue} | Select-Object -ExpandProperty Value)
        }

在撰写本文时,我突然意识到无法正常工作的XML具有第二个<Responses>标签,而SelectNodes仅覆盖了第一个Responses标签。但是,仅当存在多个条目时,才会出现第二个响应标签。因此,如果我正在考虑正确的问题,那么这里的问题是如何调整代码以查找第二个Responses标签并收集该数据并放入CSV中。我唯一的想法是添加$multiresponses = $parsedXML.SelectNodes("/CanvasResult/Submissions/Submission/Sections/Section/Screens/Screen/Responses / Responses /Response")并使用if语句检查空值并在其中添加$multiresponses项,但我不知道如何编写对空条目检查的编码,更不用说添加多个条目并用_隔开。

所以,总结一下:

预期结果:

单个条目:将XML中的数据添加到CSV中(在上面的示例1 XML中,条目将为04/08/2019)

多个条目:所有XML条目都添加到CSV中,并以_分隔(在上面的示例2 XML中,结果为04/19 / 2019_04 / 26/2019)

实际结果:

单个条目:条目数据已添加到CSV

多个条目:CSV数据为空白。

编辑:通过一些研究发现,SelectNodes不需要完整路径,并且通过将PS脚本更改为$responses = $parsedXML.SelectNodes("//Response"),我现在能够收集所有条目的数据,但是它们之间并没有分隔下划线(示例2将显示为04/19/201904/26/2019)。我已经相应地调整了问题。

1 个答案:

答案 0 :(得分:0)

回答了我自己的问题,甚至不知道我是否应该完全删除该帖子。这是我对上面相关PS代码所做的调整:

$objMarry | Add-Member -Type noteProperty

-Name $GCValue

-Value ($responses | Where-Object {$_.Label -eq $GCValue} | Select-Object -ExpandProperty Value | Foreach对象{$ _ +'_'}) }

从那里开始,为了删除每个CSV列末尾的所有下划线,我在创建CSV时添加了一个管道,以替换所有下划线的实例,后跟逗号的只是逗号(请参见下面的代码段)

    $csvobject | ConvertTo-Csv -NoTypeInformation | %{$_ -join ','}| % {$_.Replace('"','')} | %{$_.Replace('_,',',')} | Out-File $CompletedCSV

不知道这是否是实现此目的最雄辩的方法,但它确实有效。