如何使用PowerShell拆分XML字符串

k10s72fa  于 2023-06-23  发布在  Shell
关注(0)|答案(1)|浏览(78)

我试图使用第一个方法从文件中拆分数据:冒号。这不是一个问题,除了我的文件有一个数据字段的部分,其中包含xml数据,这使得拆分不起作用,因为它试图拆分作为xml数据一部分的每一行。我如何拆分这一行,使其将所有xml数据保留在Value对象中?
mcData.txt样本数据

mcDatQFC:Service Disc Cache
mcConfigFolder:C:\Configs
mcDatQFC:Service Disc Cache2
mcDatQFCProv:Simple Service Registry
mcDatQFCProviderName:Simple Service Registry Name
queuethreadsxml:<?xml version='1.0' standalone='yes'?>
<mcQueueThreads
  xmlns='http://xxxx.org/mcQueueThreads.xsd'>
  <QUEUE_THREADS>
    <THREAD_ID>1</THREAD_ID>
    <ENVIRONMENT_INFO_INDEX>3</ENVIRONMENT_INFO_INDEX>
    <DESCRIPTION>GPC</DESCRIPTION>
    <CHANNEL>CM.D.2</CHANNEL>
    <HOST_NAME>myhostname.xxx-cert-ibm-mq.mydomain.com</HOST_NAME>
    <PORT_NUMBER>2</PORT_NUMBER>
  </QUEUE_THREADS>
</mcQueueThreads>

以下是我的当前代码:

$mcContent = Get-Content "C:\Temp\mcData.txt"
$FinalMcObj = $mcContent | % {
$Delimited = $_ -split -split ':',2 

 [PSCustomObject]@{
    Name = $Delimited[0]
    Value = $Delimited[1]
 }
}
return $FinalConsulObj
kyxcudwk

kyxcudwk1#

  • 在这种情况下,逐行处理是行不通的,因为queuethreadsxml的XML值跨越了 * 多个 * 行。
  • 因此,使用Get-Content-Raw开关读取输入文件 * 作为一个整体 *,作为一个 * 单个,多行字符串 *。
  • 使用 capture group(...))作为传递给-split运算符的regex的一部分,会导致它捕获的任何内容都 * 包含 * 在输出标记数组中。
  • 通过使捕获组捕获:分隔的名称-值对的 value(该值可能跨越多行),输出标记的 pairs 分别构成名称和值。
(Get-Content -Raw C:\Temp\mcData.txt) -split ':(<[\s\S]+?\n</.+|.+)\r?\n' | 
  ForEach-Object -Begin { $i=0 } -Process { 
    if ($i++ % 2) { [pscustomobject] @{ Name=$prev; Value=$_ } } else { $prev=$_ } 
  }

注意事项:

  • 正则表达式假设以 * <开头的行结束了一个XML文档,该文档的开头在字段名后的:之后的前一行。
  • 有关正则表达式的解释和使用它的能力,请参见this regex101.com page(正则表达式匹配每个字段:沿着关联值)。

相关问题