我有以下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
答案 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
}