我将使用 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>
如何通过名称和值获取每个子节点?如何一一获取子节点并打印?
以下是如何在 PowerShell 中解析 XML;一个特殊的技巧是使用 [xml] 类型加速器
创建一个变量来保存 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>
"@
使用 [xml] 类型加速器将字符串解析为 XML:
# Convert the string to XML with the [xml] type accelerator
$xml = [xml]$xmlContent
使用
.selectNodes
获得一个孩子,例如孩子2:
# Get all Child2 nodes
$child2Nodes = $xml.SelectNodes("//Child2")
迭代每个
<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')"
}
}