使用 Powershell 循环遍历 XML 文件

3
我正在尝试运行一个“for”循环,解析下面的XML文件,以便能够将书籍的后代作为参数输入。对于每一本书,我想能够将出版商、作者和书籍类型与书名关联起来,随后在Powershell脚本中使用作为参数。
<config>
    <Book name="ABC">
        <property name="Publisher" value="XYZ"/>
        <property name="Author" value="Meow"/>
        <property name="Type" value="Fiction"/>
    </Book>
    <Book name="DEF">
        <property name="Publisher" value="wow"/>
        <property name="Author" value="Bark"/>
        <property name="Type" value="NonFiction"/>
    </Book>
    <Email>
        <Name>XXXXXX</Name>
        <Name>XXXXXX</Name>
    </Email>
</config>

以下是我目前使用的代码,但它不符合我的需求。
[xml]$xml = [xml] (Get-Content $File)
$nodes=$xml.SelectNodes("config/child::Book")

foreach($node in $nodes){
   $sid=$node.attributes['name'].value
   $value=$node.attributes['value'].value
   $sid 
   $value
   "-------------------------------"
}
1个回答

4
您可以将书籍视为数组进行简化操作:
$xml = [xml](Get-Content -Path $path)

$collection = foreach ($book in $xml.config.Book) {
    $out = [ordered]@{
        sid = $book.Name
    }

    for ($i = 0; $i -lt $book.property.Count; $i++) {
        $out[$book.property.name[$i]] = $book.property.value[$i]
    }

    [pscustomobject]$out
}

现在,$collection是一个对象数组,您可以更轻松地使用SID、Publisher、Author和Type等键进行过滤,即:

$collection | Where-Object sid -eq 'ABC'

@Haripriya1998 不确定这在这里有什么限制.. $collection | Group-Object Publisher 现在你已经把所有的出版商聚集在一起了。 - Maximilian Burszley
我通过对 $collections 进行 foreach 操作,并通过 ($entry in $collections).publisher 将值分配给参数,成功实现了我的预期效果 :) 非常感谢。 - Haripriya1998

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接