如果名称不匹配,我需要将新名称与XML文件中的名称进行比较,那么我想从XML文件中删除该参与者,如果名称不存在,那么我想将其添加。 >
state outcome media_prob
<chr> <list> <table>
1 Iowa <dbl [3]> 0.3333333
2 Minnesota <dbl [3]> 0.6666667
3 Illinois <dbl [3]> 0.0000000
我尝试下面的代码,但是它不起作用
$file = [xml]@'
<?xml version="1.0"?>
<data>
<title>Name</title>
<date>2019 Jan 01</date>
<actor>
<name>Actor Name 1</name>
<type>Actor</type>
<thumb>image.jpg</thumb>
</actor>
<actor>
<name>Actor Name 2</name>
<type>Actor</type>
<thumb>image.jpg</thumb>
</actor>
<genre>genre1</genre>
<genre>genre2</genre>
</data>
'@
答案 0 :(得分:1)
首先删除<actor>
不在新名称列表中的<name>
个节点:
$file = New-Object System.Xml.XmlDocument
$file.Load($file_path)
$file_data=$file.DocumentElement
$newNames = @(
"Actor 3"
"Actor Name 1"
)
# Use XPath to select all <name> nodes nested under an <actor> node
$existingNameNodes = $file.SelectNodes('//actor/name')
# Filter against the list of new names
$removableNameNodes = $existingNameNodes |Where-Object InnerText -notin $newNames
$removableNameNodes |ForEach-Object {
# Resolve parent <actor> node
$actor = $_.ParentNode
# Remove <actor> from its own parent
$actor.ParentNode.RemoveChild($actor) |Out-Null
}
现在,我们只需要添加列表中尚未添加的内容:
$existingNameNodes = $file.SelectNodes('//actor/name')
# Filter the new list against the existing names
$namesToAdd = $newNames |Where-Object { $_ -notin $existingNameNodes.InnerText }
foreach($name in $namesToAdd){
# Create new <actor> and <name> nodes
$newActorNode = $file.CreateElement('actor')
$newActorName = $file.CreateElement('name')
$newActorName.InnerText = $name
# Nest new <name> under new <actor>, nest <actor> under <data>
$file.data.AppendChild(
$newActor.AppendChild(
$newActorName
)
) |Out-Null
}