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

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

[复制链接]
发表于 2021-12-26 20:22:14 | 显示全部楼层
回复 14# 5i365

那这样呢,不需要知道节点的信息了
  1. $a="\s*<.*>[\r\n\s]*<.*>[\r\n\s]*<.*>ABC<.*>[\r\n\s]*<.*>[\r\n\s]*<.*>"
  2. sc b.xml ([io.file]::ReadAllText("a.xml") -replace "$a",'')  -encoding utf8
复制代码
 楼主| 发表于 2021-12-26 20:41:58 | 显示全部楼层
回复 12# idwma


    用下面的代码, 可以删除自身所在的结点, 但是没有删除父结点和爷结点
  1. $test = @'
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <score-partwise version="3.1">
  4.   <part id="P1">
  5.     <measure number="1" width="118.81">
  6.       <direction placement="above">
  7.         <direction-type>
  8.           <rehearsal default-x="-20.55" relative-y="30.00" font-weight="bold" font-size="14">ABC</rehearsal>
  9.           </direction-type>
  10.         </direction>
  11.       <direction placement="above">
  12.         <direction-type>
  13.           <rehearsal default-x="-40.55" relative-y="60.00" font-weight="bold" font-size="14">CDE</rehearsal>
  14.           </direction-type>
  15.         </direction>
  16.       </measure>
  17.     </part>
  18.   </score-partwise>
  19. '@

  20. [xml]$a = $test

  21. $b = $a.SelectSingleNode("//rehearsal[contains(text(), 'ABC')]")
  22. $b.ParentNode.RemoveChild($b)

  23. $a.save("b.xml")
复制代码
 楼主| 发表于 2021-12-26 20:59:55 | 显示全部楼层
回复 16# idwma


    对正则真是怕了, 如果看不懂, 一点也不会改, 若有特殊字符在多行里面, 真是担心不稳
 楼主| 发表于 2021-12-26 21:08:15 | 显示全部楼层
回复 16# idwma


    我的那个网盘的 示例文件 蓝莲花.musicx  后缀虽不同, 但实际是xml文件, 用您的代码[xml]方式加载时, 直接会报错, 好像是提示xml结点有错误, 但是我用前面的代码就不会, 不知道为什么
发表于 2021-12-26 21:09:09 | 显示全部楼层
回复 17# 5i365

那这样呢
  1. $test = @'
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <score-partwise version="3.1">
  4.   <part id="P1">
  5.     <measure number="1" width="118.81">
  6.       <direction placement="above">
  7.         <direction-type>
  8.           <rehearsal default-x="-20.55" relative-y="30.00" font-weight="bold" font-size="14">ABC</rehearsal>
  9.           </direction-type>
  10.         </direction>
  11.       <direction placement="above">
  12.         <direction-type>
  13.           <rehearsal default-x="-40.55" relative-y="60.00" font-weight="bold" font-size="14">CDE</rehearsal>
  14.           </direction-type>
  15.         </direction>
  16.       </measure>
  17.     </part>
  18.   </score-partwise>
  19. '@

  20. [xml]$a = $test

  21. $b = $a.SelectSingleNode("//*[./.='ABC']")
  22. $b.ParentNode.RemoveChild($b)

  23. $a.save("b.xml")
复制代码
 楼主| 发表于 2021-12-26 21:12:09 | 显示全部楼层
本帖最后由 5i365 于 2021-12-26 21:15 编辑

回复 16# idwma


    发现曙光了, 用下面的代码能识别所在标签了, 这样只需要输入 ABC 字符就可以定位了
但是怎样删除爷结点呢?

$b=$a.SelectSingleNode("//*[contains(text(), 'ABC')]")
 楼主| 发表于 2021-12-26 21:14:06 | 显示全部楼层
回复 20# idwma


    没有删除爷结点, 只删除了所在的标签, 因为它外面还有两层要删除
 楼主| 发表于 2021-12-26 21:16:18 | 显示全部楼层
回复 20# idwma
需要删除的内容如下的红色部分

    <?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-26 21:19:59 | 显示全部楼层
回复 23# 5i365


    ps 2.0,试了可以删两层
 楼主| 发表于 2021-12-26 21:24:22 | 显示全部楼层
回复 24# idwma

我也试了, 下面那个你的是OK的, 上面是我的却不行
$b = $a.SelectSingleNode("//*[contains(text(), 'ABC')]")
$b = $a.SelectSingleNode("//*[./.='ABC']")
 楼主| 发表于 2021-12-26 21:28:23 | 显示全部楼层
回复 24# idwma


    但是使用示例文件就不行了, 又是中文部分乱码, 又是直接报错

[xml]$a = type ".\蓝莲花.musicxml"

$b = $a.SelectSingleNode("//*[./.='ABC']")
$b.ParentNode.RemoveChild($b)

$a.save("b.xml")
-------------------------------------------------------
错误信息:
to type "System.Xml.XmlDocument". Error: "The 'text' start tag on line 106 position 12 does not match the end tag of 'lyric'. Line 107, position 13."
 楼主| 发表于 2021-12-27 13:35:05 | 显示全部楼层
回复 24# idwma
好像那个限定条件不稳, $text 中的第二行,即红色字部分, 处理后会带上 []

    $test = @'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE score-partwise PUBLIC "-//Recordare//DTD MusicXML 3.1 Partwise//EN" "http://www.musicxml.org/dtds/partwise.dtd">
<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>
'@
[xml]$a = $test

$b = $a.SelectSingleNode("//*[./.='ABC']")
if ($b)
{
        $b.ParentNode.RemoveChild($b)
}
$a.save("ok.xml")
发表于 2021-12-27 15:11:13 | 显示全部楼层
回复 27# 5i365


    又解锁了新支线任务什么是dtd文件
 楼主| 发表于 2021-12-27 17:46:39 | 显示全部楼层
回复 28# idwma


    这行就是 实例文件 蓝莲花.musicxml 中的第二行

这是一个我做的音乐谱子文件, 里面有特定的标签 ABC 都做错了,

我可以打开谱子软件去手动删除它, 但是我还要去找, 所以就右键用记事本打开看了一下, 发现是xml文件, 然后印象中powershell可以处理xml文件, 就找了一些贴子和资料,想试试, 能不能用powershell删除那个标签

要处理的谱子文件不是很多, 手动删除半个小时也能做完, 但对powershell感点兴趣, 也顺便看看能不能让脚本能力得到提升
发表于 2021-12-27 18:38:08 | 显示全部楼层
回复 29# 5i365


   技穷了,这个乐谱文件解析时还出错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 03:47 , Processed in 0.021594 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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