xml - 如何获取“项目”节点的值
问题描述
我有数千个 .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),因此我可以检查它的长度和第二个字符。
删除元素后如何保存文档?
解决方案
我使用以下代码使其工作。
$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($_)
}
推荐阅读
- python-3.x - 旧脚本包装器正在调用 Pip
- google-cloud-firestore - 不要让最简单的 FireStore 安全规则像找不到我的文件一样工作 - 尽管看起来像示例
- amazon-web-services - 如何让 Terragrunt 自动设置“AWS_PROFILE”环境变量?
- python - 多 GPU pytorch 预测
- actions-on-google - 发布后 Google 对话操作的价格
- python - 如何在 Pytorch 中检查模型是处于训练模式还是评估模式?
- java - ClassNotFoundException 即使我不使用那个类
- session - Gigya - 如何在用户会话结束之前延长它?
- sockets - 在 Haskell 中写入控制台和句柄不会一起使用
- javascript - 连接数组数组(?)或循环它们?