如何在powershell中对xml文件使用if语句以及如何删除子标签及其内容

2024-03-01

如何使用 if 语句并从该语句的输出中删除子标签 xml 文件中的 if 语句从我的代码中解析了所有 xml 文件。 现在我想检查 sessionType 是否等于我的 $name 输入然后删除 int 标记之间的数据。


在不真正知道 XML 文件是什么样子的情况下,从您的代码来看,它应该如下所示:

<?xml version="1.0" encoding="UTF-8"?> 
<Con> 
    <tar> 
        <tri>
            <int>
                <ses>Empty</ses>
                <description>Empty session state</description>
                <value>0</value>
            </int>
        </tri>
    </tar>
    <tar> 
        <tri>
            <int>
                <ses>RestrictedRemoteServer</ses>
                <description>Restricted remote server</description>
                <value>1</value>
            </int>
        </tri>
    </tar>
    <tar> 
        <tri>
            <int>
                <ses>Default</ses>
                <description>Default session state</description>
                <value>2</value>
            </int>
        </tri>
    </tar>
</Con>

在这种情况下,这应该有效:

$name = Read-Host -Prompt "Enter the name of the sessiontype"

$result = Get-ChildItem -Path 'D:\Testing\TestcasesOutput' -Filter '*.xml' -File -Recurse |   #'# get a collection of xml FileInfo objects
    ForEach-Object {
        $file = $_
        try {
            [xml]$xml = Get-Content -Path $file.FullName -ErrorAction Stop
            # get an array of child nodes where the <ses> nodes contain the wanted sessionType
            $nodes = @($xml.Con.tar.tri.int.ChildNodes | Where-Object { $_.'#text' -eq $name })
            if ($nodes) {
                # we have found <ses> nodes containing the wanted sessionType 
                [PSCustomObject]@{
                    'File'        = $file.FullName  
                    'SessionType' = $nodes[0].'#text'
                }
                # loop through the $nodes array 
                $nodes | ForEach-Object {
                    ## DECIDE WHAT TO DO HERE ##

                    # remove all the subnodes of the <int> node, leaving an empty node <int></int>
                    $_.ParentNode.RemoveAll()

                    # OR: remove the <int> node completely, including all sub nodes
                    # $_.ParentNode.ParentNode.RemoveAll()

                    # OR: just remove the <ses>...</ses> subnode within the <int> node
                    # [void]$_.ParentNode.RemoveChild($_)
                }

                # create a filename for the output by adding 'Updated' to the name
                $outputfile = Join-Path -Path $file.DirectoryName -ChildPath ('{0}_Updated{1}' -f $file.BaseName, $file.Extension)
                # save the updated XML file
                Write-Host "Saving file '$outputfile'"
                $xml.Save($outputfile)
            }
            else {
                Write-Host "File '$($file.FullName)' did not contain SessionType $name"
            }
        }
        catch {
            Write-Warning "Bad XML file found: '$($file.FullName)'"
        }
    }

# output on screen
$result

# or save the results as CSV file somewhere
# $result | Export-Csv -Path 'PATH TO THE RESULTS CSV FILE' -NoTypeInformation

Edit

如果你这样做NOT想要保留原始 XML 文件,但用更新的 xml 覆盖它,请使用以下命令:

$name = Read-Host -Prompt "Enter the name of the sessiontype"

$result = Get-ChildItem -Path 'D:\Testing\TestcasesOutput' -Filter '*.xml' -File -Recurse |   #'# get a collection of xml FileInfo objects
    ForEach-Object {
        $file = $_.FullName
        try {
            [xml]$xml = Get-Content -Path $file -ErrorAction Stop
            # get an array of child nodes where the <ses> nodes contain the wanted sessionType
            $nodes = @($xml.Con.tar.tri.int.ChildNodes | Where-Object { $_.'#text' -eq $name })
            if ($nodes) {
                # we have found <ses> nodes containing the wanted sessionType 
                [PSCustomObject]@{
                    'File'        = $file  
                    'SessionType' = $nodes[0].'#text'
                }
                # loop through the $nodes array 
                $nodes | ForEach-Object {
                    ## DECIDE WHAT TO DO HERE ##

                    # remove all the subnodes of the <int> node, leaving an empty node <int></int>
                    $_.ParentNode.RemoveAll()

                    # OR: remove the <int> node completely, including all sub nodes
                    # $_.ParentNode.ParentNode.RemoveAll()

                    # OR: just remove the <ses>...</ses> subnode within the <int> node
                    # [void]$_.ParentNode.RemoveChild($_)
                }

                # save the updated XML file
                Write-Host "Saving file '$file'"
                $xml.Save($file)
            }
            else {
                Write-Host "File '$file' did not contain SessionType $name"
            }
        }
        catch {
            Write-Warning "Bad XML file found: '$file'"
        }
    }

# output on screen
$result

# or save the results as CSV file somewhere
# $result | Export-Csv -Path 'PATH TO THE RESULTS CSV FILE' -NoTypeInformation

当与用户输入一起使用时Empty,结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<Con>
  <tar>
    <tri>
      <int>
      </int>
    </tri>
  </tar>
  <tar>
    <tri>
      <int>
        <ses>RestrictedRemoteServer</ses>
        <description>Restricted remote server</description>
        <value>1</value>
      </int>
    </tri>
  </tar>
  <tar>
    <tri>
      <int>
        <ses>Default</ses>
        <description>Default session state</description>
        <value>2</value>
      </int>
    </tri>
  </tar>
</Con>

希望有帮助

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在powershell中对xml文件使用if语句以及如何删除子标签及其内容 的相关文章

随机推荐

  • 如何在 MySQL LIKE 子句中使用用户变量?

    我正在尝试设置一些简单的 SQL 脚本来帮助进行一些短期数据库管理 因此 我正在设置变量以尝试更轻松地重用这些脚本 我遇到的问题具体与 LIKE 子句有关 SET email email protected cdn cgi l email
  • Ruby 是否使用 $stdout 来写入 put 和 return 的输出?

    我想知道 Ruby 使用输出流在命令行打印这些内容 irb main 001 0 gt a test gt test irb main 002 0 gt puts a test gt nil irb main 003 0 gt a gt t
  • 实例 ID 服务是否会在应用升级时启动回调 onTokenRefresh()?

    实例 ID 服务是否会在应用升级时启动回调 onTokenRefresh 参考doc https developers google com instance id 指出 令牌是唯一且安全的 但如果出现安全问题或用户在设备恢复期间卸载并重新
  • 编写 TypeScript 并为浏览器和节点生成一个库

    我有一个在 Node js 和浏览器中使用的内部库 它有许多文件 与 Grunt 任务和不同的序言连接在一起 一个用于浏览器 一个用于 Node browser dependent 3rd party libs like Mustache
  • 一个视图连接到多个模型

    我有以下问题 MyView它连接到两个视图 TaskModel and UserModel TaskModel id 1 taskName myTask creatorName myName creator id 2 UserModel i
  • 多键多值非确定性Python字典

    已经有一个多键字典 https pypi python org pypi multi key dict 1 0 2在 python 中 也是一个多值字典 我需要一个 python 字典 它既是 example probabilistical
  • JNI 错误(应用程序错误):本地引用表溢出(最大值 = 512)

    我正在尝试运行LibSVMAndroid分类 https github com spencerimp LibsvmAndroidClassification带有我自己的数据集的 Android 项目 它与已提供的数据集配合得很好 当我使用
  • 在 Docker 中使用 RabbitMQ 删除容器

    我尝试使用RabbitMQ启动Docker容器 结果下载了镜像 但容器没有启动 我在日志中收到以下消息 error RABBITMQ DEFAULT PASS is set but deprecated error RABBITMQ DEF
  • 如何将变量传递给“data-target=”角度2

    我正在使用 Angular 2 Typescript 我想创建一个切换折叠列表 这很简单 只需一个 id 即可data target但我循环遍历一个列表 所以我有动态 ID 名称 我想在我的中传递一个变量data target这样我就可以获
  • 如何在 AvalonEdit 中使文本居中?

    我正在使用 ICSharpCode 的 AvalonEdit 文本编辑器 并且有一个自定义 DocumentColorizingTransformer 我想将 ColorizeLine 内的某些文本行居中 这可能吗 我已经能够弄清楚如何以我
  • 创建 deps.edn 文件时出现问题

    大家 我决定完全重写这篇文章 以清晰的方式展示它 首先感谢大家的支持 我很感激 这是 The Clojure Workshop Packt 中的练习 我陷入了困境 我的 IDE 是 IntelliJ 我使用的是 Windows 练习 4 1
  • 正确的 chromium 浏览器品牌?

    我正在研究 Chromium 叉子 如何替换 Chromium 资源和应用程序包 资源 我发现有一天android branding res dirsgn 参数是介绍 https chromium googlesource com chro
  • 没有窗口对象存在 webpack nodejs

    我使用 webpack 和 babel 来编译我的 ecmascript 6 代码 一切正常 但如果我添加某些依赖项 例如 requests npm 包 这是我的文件 main js import os from os export cla
  • 在 Info.plist 中指定设备系列

    有没有一种方法可以仅根据 Info plist 中的键来指定设备系列 而不更改构建设置 我读过有关 UIDeviceFamily 在构建时自动添加到 Info plist 的信息 并且文档说我不应该手动添加此键 假设我无法使用 Xcode
  • Makefile 中 TARGET_ARCH 变量的用途是什么

    我注意到 Gnu Make 中的隐式规则是变量 TARGET ARCH 例如 LINK o LOADLIBES LDLIBS o LINK o CC LDFLAGS TARGET ARCH 我认为交叉编译需要这个变量 但我在 Gnu Mak
  • 使用带有绝对链接的 dompdf

    我正在使用标准 DOMPDF 代码来呈现现有网页 例如1 http jasss soc surrey ac uk 16 2 1 html dompdf new DOMPDF dompdf gt set base path artpath d
  • 将外部 CSS 转换为 Rails 中邮件的内联 CSS

    我正在尝试创建一个应用程序 该应用程序将发送样式繁重的电子邮件 并要求客户端工作 Google Gmail 除外 我研究了这个问题 看起来 Gmail 删除了外部文件中的 CSS 或嵌套在 style 标签中的 CSS 是否存在将样式从外部
  • 如何找出哪个 USB-RS232 设备位于哪个 tty 上?

    我有两个基于相同 USB RS232 芯片的不同 USB 设备 当我将它们插入 USB 时 它们会安装到 dev ttyUSB0 3 我的问题是 在脚本中 我如何找出哪个脚本位于哪个 tty 上 使用 lsusb 我可以区分它们 gt ls
  • Dart JS库,如何传递回调函数

    我们正在尝试使用 Dart 包装器来包装 D3 v4 行生成器类https pub dartlang org packages js https pub dartlang org packages js 我们已经关注了https githu
  • 如何在powershell中对xml文件使用if语句以及如何删除子标签及其内容

    如何使用 if 语句并从该语句的输出中删除子标签 xml 文件中的 if 语句从我的代码中解析了所有 xml 文件 现在我想检查 sessionType 是否等于我的 name 输入然后删除 int 标记之间的数据 在不真正知道 XML 文