【问题标题】:PowerShell XML Multiple ChildNodes Comma Separated Strings to ArrayPowerShell XML 多个 ChildNodes 逗号分隔的字符串到数组
【发布时间】:2021-09-08 10:37:25
【问题描述】:

我有一个用于 Sonus SBC 的 API,它以 XML 格式返回模拟端口的结果。我有三个子节点,每个子节点的值数量相同,我需要将它们转换为数组/表。问题是每个节点都有一个逗号分隔的字符串,所以我剩下三个对象,每个对象都包含一个如下所示的字符串:

ApplyToChannelList      1.1,1.2,1.3,1.4
ChannelOwnNumberList    71750,51375,53004,53146
FXSHotlineNumberList    53940,,,70309

我尝试尝试ConvertFrom-String,但这会创建三个单独的数组,我无法弄清楚如何将它们连接在一起。 我试过For-Each,它不会处理任何东西并且没有给出任何结果。

  • 我已尝试拆分字符串并将它们添加到自定义对象中。
  • 我尝试拆分字符串并用逗号将它们连接在一起以尝试创建一个数组。

我的猜测是我需要先拆分字符串,然后使用可能嵌套的 For-Each 将它们放入自定义对象,但是当我的第一个 For-Each 失败时,它会变得很棘手。

要获得我需要的三个节点,我使用以下内容:

$rest = Invoke-RestMethod -Uri $BackupUrl -Method GET -ContentType "text/html;charset=UTF-8" -Body $null -WebSession $ps -Verbose
$xml = ([xml]$rest.Trim())
$child = $xml.ChildNodes.Cassg | Select-Object ApplyToChannelList, ChannelOwnNumberList, FXSHotlineNumberList

非常感谢任何有关尝试什么类型的命令的建议或提示。

预期输出:

ApplyToChannelList ChannelOwnNumberList FXSHotlineNumberList
1.1                 71750               
1.2                 51375               56072

XML 输出

id                              : 20001
href                            : https://hostname.dns/rest/cassg/20001
ActionSetTableId                : 0
ApplyToChannelList              : 1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,1.10,1.11,1.12,1.13,1.14,1.15,1.16,1.17,1.18,1.19,1.20,1.21,1.22,1.23,1.24,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9,2.10,2.11,2.12,2.13,2.14,2.15,2.16,2.17,2.18,2.19,2.20
CallForward                     : 0
CallForwardActivate             : *72
CallForwardDeactivate           : *73
CallInformationFormatENM        : 0
CallerIDType                    : 0
CallerIdPrivacySignaling        : 
CasEnMProfileId                 : 0
CasLineType                     : 0
CasLoopStartFxoProfileId        : 0
CasLoopStartFxsProfileId        : CasLoopStartFxsProfileId
CasR2ProfileId                  : 0
CasSgDTMFCallerIDEndDelimiter   : 12
CasSgDTMFCallerIDStartDelimiter : 13
CasSgDirection                  : 2
CasSgENMDelimiterDigit          : 15
CasSgENMEndDigit                : 15
CasSgENMStartDigit              : 15
CasSgHuntMethod                 : 5
CasSgRingbackPlayPolicy         : 0
CasSignalingType                : 0
CasSupplementaryProfileId       : 0
ChannelOwnNumberList            : 71750,51375,53004,53146,53940,58940,70153,70309,71125,71681,75033,75021,75027,75015,75104,75120,75126,75145,75151,75320,75326,75351,75380,75449,52417,52895,75393,58627,53154,58473,51932,51871,53022,53595,19144,19152,19127,1
                                  9137,19101,19105,19112,19117,53410,54952
ConfigIEState                   : 1
Description                     : CAS FXS Analog Ports
EndOfDialDigit                  : 
FXSCallForwardingNumberList     : ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
FXSHotlineNumberList            : ,,,,,,,,,,56072,56072,56072,56072,56072,,,,56072,,,,,,,,,,,,,,,,,,,,,,,,,
NoChannelAvailableId            : 34
RelayCallingName                : 1
RouteTableId                    : RouteTableId
TimerSanitySetup                : 255000
ToneTableId                     : ToneTableId
customAdminState                : 1
rt_CasSgCurrentCalls            : 1
rt_CasSgIncomingCallsAttempted  : 197
rt_CasSgIncomingCallsConnected  : 143
rt_CasSgOutgoingCallsAttempted  : 22
rt_CasSgOutgoingCallsConnected  : 9
rt_CasSignalingType             : 0

【问题讨论】:

  • 请与我们分享 XML 的示例表示以及预期的输出。
  • 谢谢圣地亚哥。我不确定如何正确粘贴 XML 输出。我即将参加会议,但会回来尝试解决它。​​

标签: arrays xml powershell


【解决方案1】:

试试这个,在我的例子中你需要使用$xml.ChildNodes.Cassg 而不是$test

我不确定您是否真的想从 FXSHotlineNumberList 中删除前导逗号,但如果您这样做,请使用:

$fxsNumber = $test.FXSHotlineNumberList.TrimStart(',').Split(',')
# Since I don't have the original XML I'm using this to reproduce the object you already have.
$test = [pscustomobject]@{
    ApplyToChannelList = '1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,1.10,1.11,1.12,1.13,1.14,1.15,1.16,1.17,1.18,1.19,1.20,1.21,1.22,1.23,1.24,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9,2.10,2.11,2.12,2.13,2.14,2.15,2.16,2.17,2.18,2.19,2.20'
    ChannelOwnNumberList = '71750,51375,53004,53146,53940,58940,70153,70309,71125,71681,75033,75021,75027,75015,75104,75120,75126,75145,75151,75320,75326,75351,75380,75449,52417,52895,75393,58627,53154,58473,51932,51871,53022,53595,19144,19152,19127,19137,19101,19105,19112,19117,53410,54952'
    FXSHotlineNumberList = ',,,,,,,,,,56072,56072,56072,56072,56072,,,,56072,,,,,,,,,,,,,,,,,,,,,,,,,'
}

$chnlist = $test.ApplyToChannelList.Split(',')
$chnOwnNumber = $test.ChannelOwnNumberList.Split(',')
$fxsNumber = $test.FXSHotlineNumberList.Split(',')

$count = ($chnlist.Count,$chnOwnNumber.Count,$fxsNumber.Count | Measure-Object -Maximum).Maximum

$result = for($i = 0; $i -lt $count; $i++)
{
    [pscustomobject]@{
        ApplyToChannelList = $chnlist[$i]
        ChannelOwnNumberList = $chnOwnNumber[$i]
        FXSHotlineNumberList = $fxsNumber[$i]
    }
}

输出

PS /> $result | Select-Object -First 20

ApplyToChannelList ChannelOwnNumberList FXSHotlineNumberList
------------------ -------------------- --------------------
1.1                71750                                    
1.2                51375                                    
1.3                53004                                    
1.4                53146                                    
1.5                53940                                    
1.6                58940                                    
1.7                70153                                    
1.8                70309                                    
1.9                71125                                    
1.10               71681                                    
1.11               75033                56072               
1.12               75021                56072               
1.13               75027                56072               
1.14               75015                56072               
1.15               75104                56072               
1.16               75120                                    
1.17               75126                                    
1.18               75145                                    
1.19               75151                56072               
1.20               75320                                    

【讨论】:

  • 非常感谢圣地亚哥。这正是我想要做的。如果您不介意回答一个简单的问题,我已经看到您提供的 count/measure 对象和 $i = 0 的变化,它让我很困惑,实际上发生了什么。我假设 $count 部分正在计算哪一列的条目最多,所以它是第一个,但我不知道结果的 for 括号中发生了什么。还是我完全不在基地?再次感谢。
  • @Thurmus 因为您要合并 3 个数组 $chnlist$chnOwnNumber$fxsNumber,所以您需要确定哪个数组的元素数量最多,这是一种快速轻松查找的方法那就是使用measure-object -Maximum
  • @Thurmus for loop 只是一个从 0 到 $count 的循环,在每次迭代中,您将创建一个 pscustomobject,其中包含与您的 3 个数组的位置相对应的 3 个元素重新合并。您需要阅读有关此内容的信息,这不是我可以轻松解释的内容。如果答案对您有帮助并解决了您的问题,请考虑accepting it,它可能会在将来对其他人有所帮助。
  • 非常感谢圣地亚哥的帮助。
  • @Thurmus 乐于助人!
猜你喜欢
  • 2017-01-09
  • 1970-01-01
  • 2022-01-03
  • 2020-12-04
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 2012-10-30
  • 2014-05-27
相关资源
最近更新 更多