You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 10:46:15