我正在寻找一种过滤 XML 文件的方法。我找不到好的教程,所以我在这里问: 为此,这里有一个小的 XML 示例:
<?xml version="1.0" encoding="utf-8"?>
<project>
<AdditionalInformation>
<Attribute Name="YEAR" AttributeDataType="xs:int">
<Value>2024</Value>
</Attribute>
</AdditionalInformation>
<element ID="123546" Name="axis">
<Attribute Name="Axe-Info" AttributeDataType="xs:string">
<Value>Rack</Value>
</Attribute>
<element ID="58655" >
<Attribute Name="level" AttributeDataType="xs:string">
<Value>X</Value>
</Attribute>
<Attribute Name="direction" AttributeDataType="xs:string">
<Value>left</Value>
</Attribute>
</element>
<element ID="58658" >
<Attribute Name="level" AttributeDataType="xs:string">
<Value>Y</Value>
</Attribute>
<Attribute Name="direction" AttributeDataType="xs:string">
<Value>right</Value>
</Attribute>
</element>
<element ID="58685" >
<Attribute Name="level" AttributeDataType="xs:string">
<Value>Z</Value>
</Attribute>
<Attribute Name="direction" AttributeDataType="xs:string">
<Value>left</Value>
</Attribute>
</element>
<element ID="586888" >
<Attribute Name="angle" AttributeDataType="xs:string">
<Value>horizontal</Value>
</Attribute>
<Attribute Name="position" AttributeDataType="xs:int">
<Value>185</Value>
</Attribute>
</element>
<element ID="5899858" >
<Attribute Name="angle" AttributeDataType="xs:string">
<Value>vertical</Value>
</Attribute>
<Attribute Name="position" AttributeDataType="xs:int">
<Value>152</Value>
</Attribute>
</element>
</element>
<element ID="128546" Name="engine">
<Attribute Name="Eng-Info" AttributeDataType="xs:string">
<Value>Rack</Value>
</Attribute>
<element ID="5865855" >
<Attribute Name="power" AttributeDataType="xs:int">
<Value>400</Value>
</Attribute>
<Attribute Name="unit" AttributeDataType="xs:string">
<Value>kW</Value>
</Attribute>
</element>
<element ID="5865155" >
<Attribute Name="power" AttributeDataType="xs:int">
<Value>200</Value>
</Attribute>
<Attribute Name="unit" AttributeDataType="xs:string">
<Value>kW</Value>
</Attribute>
</element>
</element>
</project>
最后我想得到以下信息:
为此,我必须首先过滤名称为“axis”的x,左 Y,对 Z,左
element 节点。 然后我必须过滤所有具有 attribute-节点且名称为“level”的 element-节点
如何在 Powershell 中执行过滤操作?谢谢
Name
等于
level
的所有节点,然后从那里查找它们的下一个兄弟节点以获得
direction
值,所以:
$xml = [xml]::new()
$xml.Load('path\to\theXML.xml')
$xml.SelectNodes("//*[@Name='level']") | ForEach-Object {
[pscustomobject]@{
Level = $_.Value
Direction = $_.NextSibling.Value
}
}
这将使用示例 XML 生成此输出:
Level Direction
----- ---------
X left
Y right
Z left
另一种方法有点hacky,这会产生字符串数组而不是对象:
$i = $true
$xml.SelectNodes("//*[@Name='level' or @Name='direction']").Value |
ForEach-Object { if ($i = -not $i) { "$prev, $_" }; $prev = $_ }
# X, left
# Y, right
# Z, left