使用Powershell进行XML子项搜索

时间:2014-04-02 08:46:58

标签: xml powershell xml-parsing

我有以下xml格式,并且文本文件格式为id。我需要使用powershell来实现这一目标。我无法正确搜索子项目

号码的文字档案

121
120
133

XML文件格式:

<All>
  <section1 name= "mysec1">
    <id category="Roll" no="121" sub="Eng" />
    <id category="nam" no="123" sub="Geo" />
    <id category="Roll" no="120" sub="Bot" />
</section1>
  <section1 name= "mysec2">
    <id category="Roll" no="141" sub="Sci" />
    <id category="nam" no="133" sub="Geo" />
    <id category="Roll" no="150" sub="Bot" />
</section1>
</All>

需要根据编号在xml文件中搜索。  所以输出将是

121: Roll_mysec1_Eng
120: Roll_mysec1_Bot
133: nam_mysec2_Geo

2 个答案:

答案 0 :(得分:0)

您可以根据文本文件内容简单地过滤节点,以找到您想要的节点。

$foundIds = $xml.all.section1.id | Where { $textFile -contains $_.no }

然后,要获得您期望的输出格式,请再次按照您的需要进行格式化:

$foundIds | Foreach { "$($_.no): $($_.category)_$($_.parentnode.name)_$($_.sub)" }

以下是一个完整的示例,使用您的示例数据和替换行来获取文件中的数据(您可能希望在-Encoding调用中添加Get-Content参数)。

$textFile = @"
121
120
133
"@ -split [Environment]::NewLine

[xml]$xml = @"
<All>
  <section1 name="mysec1">
    <id category="Roll" no="121" sub="Eng" />
    <id category="nam" no="123" sub="Geo" />
    <id category="Roll" no="120" sub="Bot" />
</section1>
  <section1 name="mysec2">
    <id category="Roll" no="141" sub="Sci" />
    <id category="nam" no="133" sub="Geo" />
    <id category="Roll" no="150" sub="Bot" />
</section1>
</All>
"@

#When you have this data in files, you should replace the scripb above
#with the following two lines instead
#$textFile = Get-Content C:\textfile.txt
#[xml]$xml = Get-Content C:\data.xml

$foundIds = $xml.all.section1.id | Where { $textFile -contains $_.no }

$foundIds | Foreach { "$($_.no): $($_.category)_$($_.parentnode.name)_$($_.sub)" }

答案 1 :(得分:0)

试试这个:

cat ids.txt | % { 
  Select-Xml -Path xml.xml -XPath "//id[@no=$_]" 
  } | % { 
     $_.node 
     } | % { 
      "{0}: {1}_{2}_{3}" -f $_.no,$_.category,$( $_.parentnode | select -expand name ),$_.sub 
      }