找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 65332|回复: 38

[问题求助] PowerShell在xml文件中根据某标签属性值删除其所在的父结点

[复制链接]
发表于 2021-12-24 18:41:49 | 显示全部楼层 |阅读模式
在下面的xml文件中, 我想把rehearsal标签的属性值是ABC所在的父父结点删除, 在论坛和百度没找到确切的答案, 求请高手指点, 非常感谢


如下图所示, 即删除粉红色内的内容



---------------------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<score-partwise version="3.1">
  <part id="P1">
    <measure number="1" width="118.81">
      <direction placement="above">
        <direction-type>
          <rehearsal default-x="-20.55" relative-y="30.00" font-weight="bold" font-size="14">ABC</rehearsal>
          </direction-type>
        </direction>
      <direction placement="above">
        <direction-type>
          <rehearsal default-x="-40.55" relative-y="60.00" font-weight="bold" font-size="14">CDE</rehearsal>
          </direction-type>
        </direction>
      </measure>
    </part>
  </score-partwise>
发表于 2021-12-24 19:36:46 | 显示全部楼层
  1. (type a.xml) -join '' -replace '\s+<direction.*>ABC<.*?/direction>','' -replace '>\s',">`r`n"
复制代码
 楼主| 发表于 2021-12-24 20:07:21 | 显示全部楼层
回复 2# idwma


    感谢大侠帮忙, 能实现删除效果,
我在代码后面加了下面代码, 生成了新的xml文件,
但有一个问题, 原来的第二行跑到第一行后面了,
具体的实例还没有尝试, 但总感觉用正则删,可能会有些不稳,

| out-file aaa.xml -Encoding default
 楼主| 发表于 2021-12-24 20:12:06 | 显示全部楼层
找到一篇文章, 但是水平有限, 看不太懂
https://cloud.tencent.com/developer/ask/138618
发表于 2021-12-24 20:42:00 | 显示全部楼层
回复 3# 5i365

不稳吗?正则挻通用的万金油
  1. $a=type a.xml
  2. $ofs="`n"
  3. "$a" -replace '\s*<direction[\s\S]*>ABC<[\s\S]*?/direction>',''
复制代码
 楼主| 发表于 2021-12-25 08:34:33 | 显示全部楼层
回复 5# idwma


    用notepad2打开输出后的xml, 有下面的提示
 楼主| 发表于 2021-12-25 12:34:03 | 显示全部楼层
本帖最后由 5i365 于 2021-12-25 12:50 编辑

回复 5# idwma


按上面链接的代码, 照葫芦画了两个瓢, 但是还是不能删除, 但是$nod可以取到值:
  1. [xml]$xml = Get-Content '.\xml.xml'

  2. $nod = $xml.SelectSingleNode("//rehearsal[contains(text(), 'ABC')]")
  3. $nod

  4. [void]$xml.score-partwise.part.measure.RemoveChild($nod.ParentNode)

  5. $xml.Save('.\ok.xml')
复制代码
------------------------------------------------
  1. $rom, $inp = '.\list.txt', '.\xml.xml'
  2. ($lst, $xml = (Get-Content $rom), [xml](Get-Content $inp))[0].ForEach{
  3.         $nod = $xml.SelectSingleNode("//rehearsal[contains(text(), '$_')]")
  4.         [void]$xml.score-partwise.part.measure.RemoveChild($nod.ParentNode)
  5. }
  6. $xml.Save('.\ok.xml')
复制代码
发表于 2021-12-25 12:48:20 | 显示全部楼层
回复 7# 5i365

不是这样写的。且这样没有通用性,你应该按"ABC"去查找,不宜写死节点名。查找InnerText="ABC"的节点或父节点或爷节点。
 楼主| 发表于 2021-12-25 12:51:56 | 显示全部楼层
回复 8# xczxczxcz


    感谢提醒, 但是水平真是有限, 只懂一二, 卡关键点上了
上面链接的例子, 是删父结点, 我的是删爷结点
 楼主| 发表于 2021-12-25 15:20:06 | 显示全部楼层
回复 5# idwma


    找到一段代码, 能理解, 但是不会运用
  1. $test = "<task>
  2.    <list>list1</list>
  3.    <list>list2</list>
  4.    <list>list3</list>
  5.    <list>list4</list>
  6.    <list>list5</list>
  7. </task>"

  8. [xml]$myxml = $test

  9. $remove = $myxml.task.SelectSingleNode("//list[.='list2']")

  10. $remove.ParentNode.RemoveChild($remove)
复制代码
 楼主| 发表于 2021-12-26 00:36:21 | 显示全部楼层
回复 5# idwma


    试了一个长的xml文件, <text>标签内的中文都成乱码了, 加编码参数也不行
https://wss1.cn/f/77e4p6wnaq6 复制链接到浏览器打开
发表于 2021-12-26 15:02:12 | 显示全部楼层
本帖最后由 idwma 于 2021-12-26 15:03 编辑

回复 11# 5i365
  1. sc b.xml ([io.file]::ReadAllText("a.xml") -replace '\s*<direction.*>[\r\n\s]*<.*>ABC<[\s\S]*?/direction>','')
复制代码
发表于 2021-12-26 17:43:44 | 显示全部楼层
本帖最后由 idwma 于 2021-12-26 17:48 编辑

回复 10# 5i365
  1. https://docs.microsoft.com/zh-cn/previous-versions/dotnet/netframework-4.0/ms256086(v=vs.100)
复制代码
  1. [xml]$a=type a.xml
  2. $b=$a.SelectSingleNode("//descendant::direction[direction-type/rehearsal='ABC']")
  3. $b.ParentNode.RemoveChild($b)
  4. $a.save("b.xml")
复制代码
 楼主| 发表于 2021-12-26 18:51:58 | 显示全部楼层
回复 13# idwma


    非常感谢!
但是表达式中的限定条件太多了, 而且有时并不知道那些条件, 只知道某个结点的值是ABC, 感觉应该还有更简单的办法
 楼主| 发表于 2021-12-26 20:11:24 | 显示全部楼层
回复 13# idwma


刚刚试了上面两楼的代码,
12楼仍然是有乱码
13楼直接报错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 05:45 , Processed in 0.011713 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表