2012-09-19 117 views
2

我想創建一個Powershell腳本,它可以自動解析XML,但只收集某些信息。Powershell XML解析

現在,我的腳本看起來與此類似。

[xml]$xml = Get-Content .\myxml.xml 
$foo_sub_length = $xml.report.foos.foo.length - 1 
$foo_looper = 0 
$foo_looper_brackets = "[$foo_looper]" 
if ($foo_sub_length -eq "") {$foo_looper_brackets = ""} 
do { 
    $xml.report.foos.foo$foo_looper_brackets.bar 
} 
while ($foo_looper -le $foo_sub_length) 

基本上,它需要經過並打印出所有的$ xml.report.foos.foo.bar值。當我運行此腳本時,我收到錯誤,

Unexpected token 'node_looper_brackets' in expression or statement. 
At C:\Users\notarealuser\Desktop\xmlscript.ps1:10 char:55   #not reflective of the above script 
+ CategoryInfo   : ParserError: (foo_looper_brackets:String) [], ParseException 
+ FullyQualifiedErrorId : UnexpectedToken 
+  $xml.report.foos.foo$foo_looper_brackets <<<< .bar 

爲何或如何我的循環不工作任何想法?

回答

3

用XPath提取這些信息可能會更好。如果你不使用XML命名空間,這是非常瑣碎(和命名空間僅使得稍硬):

PS> [xml]'<doc><title>Foo</title><title>Bar</title></doc>' | 
     Select-Xml '/doc/title' | Foreach {$_.Node.InnerText} 

Foo 
Bar 
+0

嗯,如何將嵌套信息工作的任何想法?例如,說doc/title/foo1/bar2/info和doc/title/foo2/bar1/info等中的doc/title/foo1/bar1/info和info中的信息... – Ondaje

+0

嘗試使用xpath表達式,如'' // info''。無論它們碰巧在哪裏,都可以找到所有'info'節點。 –

+0

所以,爲了澄清,我將能夠做doc/title // foo // bar // info? – Ondaje

1

試試這個:

[Xml][email protected]" 
<doc><title> 
<foo2><bar1><info>1</info></bar1></foo2> 
<foo1><bar1><info>2</info></bar1></foo1> 
<foo1><bar2><info>3</info></bar2></foo1> 
</title></doc> 
"@ 

$doc.CreateNavigator().Select('/doc/title//info') | select value