遍历xml标记

时间:2015-08-04 23:17:57

标签: xml powershell scripting

我是Powershell的新手,我正在尝试读取XML文档,然后为每个名为<document>的节点读取内容。

不太确定如何在powershell中执行此操作。目前,我只是查看名为<document>的第一个实例,然后在其中。但是文件可以有多个名为<document>的节点,例如示例。

如何获取每个名为document的节点的实例,然后通过它们foreach?理想情况下,我想要一个名为document的节点列表返回,然后我可以迭代它们。

<List state='null'>
    <document>
        <i_state>null</i_state>
        <i_toronto>qwe</i_toronto>
        <i_site>123</i_site>
        <i_library>potluck</i_library>
        <i_url>www.google.com</i_url>
        <mmdete>
            <metafy>Oblong</metafy>
        </mmdete>
       </document>
    <document>
        <i_state>null</i_state>
        <i_toronto>qwe</i_toronto>
        <i_site>123</i_site>
        <i_lib>potluck</i_lib>
        <i_url>https:www.google.com</i_url>
        <mmdete>
            <metafy>Oblong</metafy>
        </mmdete>
       </document>

</List>

2 个答案:

答案 0 :(得分:2)

您可以使用SelectNodes('//nodename')

执行此操作
$XmlFile = [xml](Get-Content .\file.xml)
$XmlFile.SelectNodes('//document') |ForEach-Object {
    $_ # this now refers to a "document" XmlNode
}

答案 1 :(得分:1)

PowerShell可以很好地使用XML,只要它知道它正在查看它。如果将变量设为[XML]类型,则可以通过多种方法轻松地引用这些文档节点。例如,我将您的样本保存为“testdata.txt”并执行以下操作:

[xml]$source = get-content testdata.txt
$source.list.document

PowerShell返回以下内容:

i_state   : null
i_toronto : qwe
i_site    : 123
i_library : potluck
i_url     : www.google.com
mmdete    : mmdete

i_state   : null
i_toronto : qwe
i_site    : 123
i_lib     : potluck
i_url     : https:www.google.com
mmdete    : mmdete

如果您不知道该节点的位置,可以使用Select-XML cmdlet按xpath搜索节点。

$source|select-xml -XPath '//document'|select -expand node

这将提供相同的输出。