2012-09-19 82 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