我试图用Powershell查询MSMQ,然后从BodyStream中读取(在我的情况下)XML。在XML 慢之前剥离垃圾......就像每条记录200-500毫秒一样。
拉出XML似乎很快(下面),但是替换需要永远。
$msmq = Get-MsmqQueue -Name "myqueuelovesme"
$var = Receive-MsmqQueue -input $msmq -Peek -Count 500 -Timeout 5000 -RetrieveBody | foreach {
$sr = $_.BodyStream.ToArray()
$pr = $enc.GetString($sr)
[xml]$clean= $pr -creplace ".*:Message:"
select-xml -xml $clean -XPath "/MyXML/Defin" | foreach {$_.node}
}
$var
bodystream的内容如下所示:
F:01.02.03:1234567890:Message:<MyXML><Defin xmlns:dsi="http:// [...]
XML总是在第4个分号之后开始,所以我不认为我可以拆分/加入(因为XML中的分号数量可以改变)。我看到creplace比替换更快,但两者都不是很好。
有什么建议吗? (哎呀,剩下的代码还可以吗?)
答案 0 :(得分:2)
我想象的选择吨。不确定哪一个是最好的。我会尝试添加一些我们去的地方。肯定会出现其他解决方案。你说你认为你不能分裂/加入 ...... BLAM!
'F:01.02.03:1234567890:Message:<MyXML><Defin xmlns:dsi="http:// [...]'.Split(":",5)[-1]
用冒号分割字符串,但最多只能分为5个元素。然后只返回最后一个元素
<MyXML><Defin...
。您可以将此应用于您的实现:
[xml]$clean= $pr.Split(":",5)[-1]
您也可以使用相同的逻辑拆分第一个<
。
[xml]$clean= "<$($pr.Split("<",2)[-1])"
由于我们正在分割<
,我们只需将其添加回字符串即可。
我使用Measure-Command
和indexOf
进行了Split
测试。同时运行100000次大约需要2秒钟。他们都是脖子和脖子。与-creplace
相同的测试花了大约7秒钟。 Measure-Command
并不完美,其结果可能会受到质疑,但似乎这里的答案(到目前为止)都会表现得更好。
答案 1 :(得分:2)
这是如何表现的?
$clean = [xml]$pr.Substring($pr.IndexOf('<'))