如何用PowerShell从指定字符串中提取value和en字段值?
PowerShell提取XML中和标签内容的解决方案
优先推荐:用PowerShell原生XML解析(最可靠)
别用正则处理XML,太容易踩坑——XML结构稍微变点(比如标签换行、加个属性),正则就失效了。直接用PowerShell的XML对象处理才是正道:
假设你的XML字符串存在变量$testText里,比如:
<root> <query t="default"> <value>morning</value> <en>morning</en> </query> <query t="default"> <value>afternoon</value> <en>afternoon</en> </query> </root>
执行以下代码就能按要求输出:
# 把字符串转成XML对象 $xml = [xml]$testText # 遍历所有t属性为default的query节点 foreach ($queryNode in $xml.SelectNodes("//query[@t='default']")) { $valueContent = $queryNode.value.InnerText $enContent = $queryNode.en.InnerText Write-Host "value: $valueContent , en: $enContent" }
备选:修正后的正则方案(仅适用于结构简单的XML)
如果你非要用正则,得调整匹配逻辑,直接抓取
# 定义匹配value和en标签内容的正则 $valueRegex = '<value>(.+?)</value>' $enRegex = '<en>(.+?)</en>' # 提取所有value和en的内容 $valueList = [regex]::Matches($testText, $valueRegex) | ForEach-Object { $_.Groups[1].Value } $enList = [regex]::Matches($testText, $enRegex) | ForEach-Object { $_.Groups[1].Value } # 对应输出每一组结果 for ($idx = 0; $idx -lt $valueList.Count; $idx++) { Write-Host "value: $($valueList[$idx]) , en: $($enList[$idx])" }
注意:这个方法只适合XML结构完全规整、没有嵌套或额外属性的情况,一旦XML有变化,很可能匹配失败。
内容的提问来源于stack exchange,提问作者Owais Ahmed
相关产品推荐
相关产品推荐

