我試圖通過基于下面的 XML 搜索 ModelName 或 PlatformID 來找出如何洗掉 xml 節點。我已經嘗試了幾種方法,但我似乎無法讓它作業。有任何想法嗎?
XML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<HPModels>
<Model>
<ModelName>HP EliteBook x360</ModelName>
<PlatformID>8725</PlatformID>
</Model>
<Model>
<ModelName>HP EliteBook x360</ModelName>
<PlatformID>876d</PlatformID>
</Model>
</HPModels>
我正在嘗試使用它,但我沒有運氣
$file = "C:\Temp\test1.xml"
$xmlfile = [XML](Get-Content $file)
$item = Select-XML -Xml $xmlfile -XPath '//ModelName[Name="HP EliteBook x360"]'
$item.Node.ParentNode.RemoveChild($item.node)
我正進入(狀態:
You cannot call a method on a null-valued expression.
At line:4 char:1
uj5u.com熱心網友回復:
從您的評論中:
<Model>如果找到匹配項,我想洗掉整個節點。
在這種情況下,我建議使用以下運算式作為基本運算式//Model- 然后您可以使用現有運算式作為謂詞[...]:
$items = Select-Xml $xmlFile -XPath '//Model[./ModelName = "HP EliteBook x360"]'
在這里,我們Select-Xml選擇所有<Model>具有直接子節點的節點<ModelName>,其內部值為"HP EliteBook x360"
您還可以..在決議適當的子節點后使用選擇器“向上走”到父節點:
$items = Select-Xml $xmlFile -XPath '//ModelName[. = "HP EliteBook x360"]/..'
我(個人)不喜歡這種模式,但它是完全有效的 XPath :)
一旦選擇器運算式被修復,請確保您一次處理結果 1 -Select-Xml可能會回傳多個節點:
foreach($item in $items){
$node = $item.Node
$node.ParentNode.RemoveChild($node)
}
如果您想接受不同的模型名稱作為引數引數,param()請在腳本的第一行添加一個塊,然后在 XPath 運算式中使用它:
param(
[Parameter(Mandatory)]
[string]$FilePath,
[Parameter(Mandatory)]
[string]$ModelName
)
if($ModelName -like "*'*"){
throw 'Cannot process model name with apostrophe'
return
}
$file = Convert-Path $FilePath
$xmlfile = [XML](Get-Content $file)
$items = Select-XML -Xml $xmlfile -XPath "//ModelName[Name='${ModelName}']"
foreach($item in $items){
$node = $item.Node
$node.ParentNode.RemoveChild($node)
}
$xmlfile.Save($file)
然后在呼叫腳本時傳遞檔案路徑和模型名稱的引數引數:
.\Remove-ModelFromXml.ps1 -FilePath .\path\to\file.xml -ModelName "HP EliteBook x360"
uj5u.com熱心網友回復:
謝謝@Mathias R. Jessen。如果其他人想知道,這是正確的方法。
XML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<HPModels>
<Model>
<ModelName>HP EliteBook x360</ModelName>
<PlatformID>8725</PlatformID>
</Model>
<Model>
<ModelName>HP EliteBook x360 1030</ModelName>
<PlatformID>876d</PlatformID>
</Model>
</HPModels>
$modelselect = "HP EliteBook x360"
$file = "C:\Temp\test1.xml"
$xmlfile = [XML](Get-Content $file)
$item = Select-Xml $xmlFile -XPath "//Model[./ModelName = '$modelselect']"
foreach($node in $item.Node)
{
$node.ParentNode.RemoveChild($node)
}
$xmlFile.Save($file)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/412544.html
標籤:
