如何从xml文件中删除嵌套元素中的嵌套

时间:2020-09-12 21:03:02

标签: xml powershell

如果名称不匹配,我需要将新名称与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>
'@

1 个答案:

答案 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
}
相关问题