Powershell 如何过滤 XML 节点

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

我正在寻找一种过滤 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>

最后我想得到以下信息:

x,左 Y,对 Z,左

为此,我必须首先过滤名称为“axis”的

element 节点。 然后我必须过滤所有具有 attribute-节点且名称为“level”element-节点

如何在 Powershell 中执行过滤操作?

谢谢

xml powershell
1个回答
1
投票
也许像这样,找到属性

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
    
© www.soinside.com 2019 - 2024. All rights reserved.