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

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

在下面的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>

回复 38# idwma


    多谢

TOP

回复 37# 5i365

搜一下就有了照抄了
     https://developer.mozilla.org/en ... Functions/translate
  1. $a.SelectSingleNode("//*[*/rehearsal=translate('a', 'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')]")
复制代码

TOP

回复 36# idwma


    如何让a这个文本不区分大小写? 这个只能找小a
$a.SelectSingleNode("//*[*/rehearsal='a']")

TOP

回复 35# 5i365
  1. $a.SelectSingleNode("//*[*/rehearsal='A']")
复制代码
1

评分人数

    • 5i365: 牛X 多谢, 这回感觉应该稳了技术 + 1

TOP

本帖最后由 5i365 于 2021-12-27 19:49 编辑

回复 30# idwma


实例中下面这种匹配真出错了 , 我不再找文本是 ABC 的,换成了找是 A 的, 结果把别的地方的A也删除了,

$b = $a.SelectSingleNode("//*[./.='A']"

看来至少要限定A所在的标签, 下面这样可以定位所在标签了, 但没有办法删除爷标签 :

$b = $a.SelectSingleNode("//rehearsal[./.='A']"

TOP

回复 30# idwma


    我感觉下面这种可能也不稳, 所以想找上面那种结点的方法来删除:
$b = $a.SelectSingleNode("//*[./.='ABC']")

TOP

回复  5i365

那这样呢,不需要知道节点的信息了
idwma 发表于 2021-12-26 20:22



    这种不稳, 实例中, 把好多地方都删除了

TOP

回复 30# idwma

试了一下, 这样可以找到爷结点, 但是还是删除不干净, 还是留下了标签

$b = $a.SelectSingleNode("//rehearsal[text()='ABC']")

$b.ParentNode.ParentNode.RemoveAll()

TOP

回复 30# idwma
这样解析时不报错了

    [xml]$a = Get-Content ".\蓝莲花.musicxml" -Encoding UTF8

TOP

回复 29# 5i365


   技穷了,这个乐谱文件解析时还出错

TOP

回复 28# idwma


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

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

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

要处理的谱子文件不是很多, 手动删除半个小时也能做完, 但对powershell感点兴趣, 也顺便看看能不能让脚本能力得到提升

TOP

回复 27# 5i365


    又解锁了新支线任务什么是dtd文件

TOP

回复 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")

TOP

回复 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."

TOP

返回列表