我最近开始为一家新公司工作,他们的先前技术创建了一个Powershell脚本,该脚本旨在从云表单软件的REST API中提取XML数据。它从API中提取相关数据,并将其转换为可读的元数据CSV,以附加到我们使用的内部文件管理软件的ADI导入的文件中。我了解该脚本的工作原理,并且与以前的表单一样运行良好。问题在于一种新表单,该表单旨在在一个响应中包含多个条目。如果在此表单中添加了多个条目,则脚本不会将数据携带到CSV中。
我是Powershell的新手,不知道该从哪里开始解决此问题。
我试图删除XML中除最相关的部分之外的所有部分,以用作我正在使用的示例,从而对整个XML结构进行了相当大的更改。这是两个XML数据示例:
<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>
<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)。我已经相应地调整了问题。
答案 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
不知道这是否是实现此目的最雄辩的方法,但它确实有效。