将XML(XML)反序列化为PSObject和性能

时间:2014-07-11 00:12:22

标签: c# xml regex powershell sharepoint

亲爱的 SO'ers

我有一台运行Powershell的服务器通过Web服务访问SharePoint 2010数据。我有几个PS脚本在SharePoint数据上执行业务逻辑。 虽然此脚本有效但我的问题是性能

  • 我省略了烦人的 ows_ 前缀
  • 我考虑使用 XMLDocument SelectNodes ,但 记住,这并不能说明将提供哪些字段 要充满活力。
  • 我尝试访问PSSerializer this post建议,但我没有。是PS 3.0吗?
  • 我正在搜索多值字段并将其转换为 SPFieldLookupValueCollection
  • matches2.Matches
  • 的迭代过程中,出现的效果
  

花费 45秒来处理 800 项目,我相信这一点   方法可以改进。

SP2010XmlToPSObject.ps1

param ([string]$xml)

#Handle empty result set
if($xml.IndexOf("ItemCount='0'") -ge 0){return @()}

#Load SharePoint DLL
$a = [Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")

$rows = @()
$matches = $xml | Select-String "(<z:row(?:.|\n|\r)*?(?:/>))" -AllMatches

$matches.Matches | %{
      $obj = New-Object PSObject
      $matches2 = $_.Value | Select-String "(?:ows_)(\w*)(?:=)(?:`")((.*?)(?:`"))" -AllMatches
      $matches2.Matches | % {
            #handle multi-value fields
            if($_.Groups[3].Value.IndexOf(";#") -gt -1){
                  #$a = @()
                  $o = New-Object Microsoft.SharePoint.SPFieldLookupValueCollection $_.Groups[3].Value
                  $obj | Add-Member NoteProperty $_.Groups[1].Value $o
            }
            else{
                  $obj | Add-Member NoteProperty $_.Groups[1].Value $_.Groups[3].Value
            }
      }

      $rows += $obj
}

return $rows

P.S。对不起,看起来SO语法荧光笔不喜欢powershell的转义(`)char。

1 个答案:

答案 0 :(得分:0)