首页 > 解决方案 > 如何获取“项目”节点的值

问题描述

我有数千个 .XML 文件,其中包含类似于以下的代码:

<work-item>
    <field id="assignee">
        <list>
            <item>John Doe</item>
            <item>AZCDEF</item>
        </list>
    </field>...

我正在使用以下 Powershell 来尝试获取“项目”节点的值:

$files = Get-ChildItem -Path C:\temp\dev\workitems\ -include workitem.xml -Recurse | % { $_.FullName }
$files | foreach {
    $Doc = [xml]$MyXML = Get-Content $_
    write($_)
    #write($Doc.name)
    $XMLNode  = $MyXML.SelectNodes('//field[@id="assignee"]/list/item')

$XMLNode | foreach {
    If ($_.'#text'.length -ne 6) {
        write("Removing " + $_.'#text' + " From xml.")
        [void]$_.ParentNode.RemoveChild($_)
    }
}
$Doc.Save($_)   

}

但是,保存文档时出现以下错误:

方法调用失败,因为 [System.Object[]] 不包含名为“Save”的方法。在 C:\ALM\PowerShell Scripts\Remove bad assignee.ps1:14 char:14 + $Doc.Save <<<< ($_)
+ CategoryInfo : InvalidOperation: (Save:String) [], RuntimeException + FullyQualifiedErrorId : MethodNotFound

问题是我似乎无法获得项目节点的值(John Doe 或 AZCDEF),因此我可以检查它的长度和第二个字符。

删除元素后如何保存文档?

标签: xmlpowershellnodesselectnodes

解决方案


我使用以下代码使其工作。

$files = Get-ChildItem -Path C:\temp\dev\workitems\ -include workitem.xml -Recurse | % { $_.FullName }
$files | foreach {
    write($_)
    [xml]$MyXML = Get-Content $_
    $XMLNode  = $MyXML.SelectNodes('//field[@id="assignee"]/list/item')

    $XMLNode | foreach {
        write($_.InnerText)
        If (($_.InnerText.Length -le 2) -or ($_.InnerText.Length -ne 6) -or ($_.InnerText[1] -ne 'Z')) {
            write("Removing " + $_.InnerText + " From xml.")
            [void]$_.ParentNode.RemoveChild($_)
        }
    }
    $MyXML.Save($_)   
}

推荐阅读