如何使用PowerShell解析嵌套XML并遍历各级子节点
PowerShell解析嵌套XML并遍历子节点
1. 先加载XML内容
不管是从文件还是字符串加载,先把XML转成PowerShell可操作的XML对象:
从文件加载
$xmlPath = "C:\你的XML文件路径.xml" $xml = [xml](Get-Content -Path $xmlPath -Encoding UTF8)
用测试字符串加载(快速验证)
$xmlContent = @" <Root> <Person> <Name>张三</Name> <Age>30</Age> <Contact> <Phone>13800138000</Phone> <Email>zhangsan@example.com</Email> </Contact> </Person> <Person> <Name>李四</Name> <Age>25</Age> <Contact> <Phone>13900139000</Phone> </Contact> </Person> </Root> "@ $xml = [xml]$xmlContent
2. 递归遍历所有子节点(含嵌套)
写个递归函数,自动遍历每一层节点,输出名称和对应的值:
function Traverse-XmlNodes { param( [Parameter(Mandatory=$true)] [System.Xml.XmlNode]$Node, [string]$Indent = "" ) foreach ($childNode in $Node.ChildNodes) { # 跳过XML里的空白换行、空格节点 if ($childNode.NodeType -eq [System.Xml.XmlNodeType]::Text -and [string]::IsNullOrWhiteSpace($childNode.Value)) { continue } if ($childNode.NodeType -eq [System.Xml.XmlNodeType]::Element) { Write-Host "$Indent* 节点名称: $($childNode.Name)" # 有文本值就输出 if (![string]::IsNullOrWhiteSpace($childNode.InnerText.Trim())) { Write-Host "$Indent 节点值: $($childNode.InnerText.Trim())" } # 递归往下遍历子节点 Traverse-XmlNodes -Node $childNode -Indent "$Indent " } } } # 从根节点开始遍历 Traverse-XmlNodes -Node $xml.Root
运行后会输出层级分明的节点信息,比如:
* 节点名称: Person 节点值: 张三3013800138000zhangsan@example.com * 节点名称: Name 节点值: 张三 * 节点名称: Age 节点值: 30 * 节点名称: Contact 节点值: 13800138000zhangsan@example.com * 节点名称: Phone 节点值: 13800138000 * 节点名称: Email 节点值: zhangsan@example.com * 节点名称: Person 节点值: 李四2513900139000 * 节点名称: Name 节点值: 李四 * 节点名称: Age 节点值: 25 * 节点名称: Contact 节点值: 13900139000 * 节点名称: Phone 节点值: 13900139000
3. 按名称精准获取子节点
如果要直接定位特定节点,有两种常用方式:
直接层级访问(已知节点结构时)
# 获取第一个Person的姓名 $firstName = $xml.Root.Person[0].Name.InnerText Write-Host "第一个人的姓名: $firstName" # 遍历所有Person的电话 foreach ($person in $xml.Root.Person) { $phone = $person.Contact.Phone.InnerText Write-Host "$($person.Name.InnerText)的电话: $phone" }
XPath查询(复杂结构或模糊匹配时)
# 获取所有Phone节点 $allPhones = $xml.SelectNodes("//Phone") foreach ($phone in $allPhones) { Write-Host "电话: $($phone.InnerText)" } # 获取年龄大于28的人的姓名 $olderPersons = $xml.SelectNodes("//Person[Age > 28]/Name") foreach ($name in $olderPersons) { Write-Host "年龄超28的人: $($name.InnerText)" }
关键提示
- 递归是处理嵌套XML的核心,能自动穿透所有层级
- 用
InnerText获取节点文本值,会自动合并子节点的文本内容 - XPath适合复杂筛选,比直接层级访问更灵活
内容的提问来源于stack exchange,提问作者Laowantong
相关产品推荐
相关产品推荐

