如何使用 PowerShell 解析嵌套 XML

问题描述 投票:0回答:1

我将使用 PowerShell 解析嵌套的 xml 文件。有没有办法一一遍历它的子节点及其子节点的节点?

例如:

<?xml version="1.0"?>
<root xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
  <Node1 name="A"/>
  <Node2 name="B"/>
  <Node3>
    <Element1 id="1" type="Element">
      <State value = "live" /State>
      <Child1 name="dogName">
        <SubChild1 id="11111">
        </SubChild1>
      </Child1>
      <Child2>
        <SubChild2 name="color" value="red" />
        <SubChild2 name="skin" value="none" />
        <SubChild2 name="other" value="lost" />
      </Child2>
      <Child3>
        <SubChild3>FlagMark=GO</SubChild3>
        <SubChild3>Dog</SubChild3>
      </Child3>
    </Element1>
    <Element2 id="2" type="Element">
      <State value = "live">
      <Child1 name="catName">
        <SubChild1 id="22222">
        </SubChild1>
      </Child1>
      <Child2>
        <SubChild2 name="color" value="brown" />
        <SubChild2 name="skin" value="thick" />
        <SubChild2 name="other" value="unknown" />
      </Child2>
      <Child3>
        <SubChild3>FlagMark=Run</SubChild3>
        <SubChild3>Cat</SubChild3>
      </Child3>
    </Element2>
    <Element3>
      ...
    </Element3>
  </Node3>
</root>

如何通过名称和值获取每个子节点?如何一一获取子节点并打印?

xml powershell parsing traversal
1个回答
0
投票

以下是如何在 PowerShell 中解析 XML;一个特殊的技巧是使用 [xml] 类型加速器

  1. 创建一个变量来保存 XML 字符串:

    # Declare our XML string
    $xmlContent = @"
    <?xml version="1.0"?>
    <root xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
      <Node1 name="A"/>
      <Node2 name="B"/>
      <Node3>
        <Element1 id="1" type="Element">
          <State value = "live"/>
          <Child1 name="dogName">
            <SubChild1 id="11111"/>
          </Child1>
          <Child2>
            <SubChild2 name="color" value="red"/>
            <SubChild2 name="skin" value="none"/>
            <SubChild2 name="other" value="lost"/>
          </Child2>
          <Child3>
            <SubChild3>FlagMark=GO</SubChild3>
            <SubChild3>Dog</SubChild3>
          </Child3>
        </Element1>
        <!-- ...snip... -->
      </Node3>
    </root>
    "@
    
  2. 使用 [xml] 类型加速器将字符串解析为 XML:

    # Convert the string to XML with the [xml] type accelerator
    $xml = [xml]$xmlContent
    
  3. 使用

    .selectNodes
    获得一个孩子,例如孩子2

    # Get all Child2 nodes
    $child2Nodes = $xml.SelectNodes("//Child2")
    
  4. 迭代每个

    <Child2>
    节点及其每个
    <SubChild>
    节点

    # Get a child
    foreach ($child2 in $child2Nodes) {
       # Iterate over each subchild
       foreach ($subChild2 in $child2.ChildNodes) {
          # Print their names and values
          Write-Host "SubChild2 Name: $($subChild2.getAttribute('name')), Value: $($subChild2.getAttribute('value'))"
       }
    }
    

然后可以用同样的思路来枚举Child3:

# Get all Child3 nodes
$child3Nodes = $xml.SelectNodes("//Child3")

foreach ($child3 in $child3Nodes) {
    # Iterate over each child of Child3 and print
    foreach ($subChild3 in $child3.ChildNodes) {
        # Print SubChild3 content
        Write-Host "SubChild3 Content: $($subChild3.'#text')"
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.