注册
登录
论坛
搜索
帮助
导航
私人消息 (0)
公共消息 (0)
论坛任务 (0)
系统消息 (0)
好友消息 (0)
帖子消息 (0)
批处理之家
»
PowerShell求助&讨论
» PowerShell在xml文件中根据某标签属性值删除其所在的父结点
[新手上路]
批处理新手入门导读
[视频教程]
批处理基础视频教程
[视频教程]
VBS基础视频教程
[批处理精品]
批处理版照片整理器
[批处理精品]
纯批处理备份&还原驱动
[批处理精品]
CMD命令50条不能说的秘密
[在线下载]
第三方命令行工具
[在线帮助]
VBScript / JScript 在线参考
 
1
2
返回列表
发帖
5i365
发短消息
加为好友
5i365
(我心飞扬)
当前离线
UID
92265
帖子
1013
精华
0
积分
1228
PB
1186
技术
14
捐助
0
阅读权限
50
在线时间
916 小时
注册时间
2019-2-20
最后登录
2024-7-16
上尉
帖子
1013
积分
1228
技术
14
捐助
0
注册时间
2019-2-20
16
楼
跳转到
»
发表于 2021-12-26 21:16
|
显示全部帖子
回复
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>
TOP
5i365
发短消息
加为好友
5i365
(我心飞扬)
当前离线
UID
92265
帖子
1013
精华
0
积分
1228
PB
1186
技术
14
捐助
0
阅读权限
50
在线时间
916 小时
注册时间
2019-2-20
最后登录
2024-7-16
上尉
帖子
1013
积分
1228
技术
14
捐助
0
注册时间
2019-2-20
17
楼
发表于 2021-12-26 21:24
|
显示全部帖子
回复
24#
idwma
我也试了, 下面那个你的是OK的, 上面是我的却不行
$b = $a.SelectSingleNode("//*[contains(text(), 'ABC')]")
$b = $a.SelectSingleNode("//*[./.='ABC']")
TOP
5i365
发短消息
加为好友
5i365
(我心飞扬)
当前离线
UID
92265
帖子
1013
精华
0
积分
1228
PB
1186
技术
14
捐助
0
阅读权限
50
在线时间
916 小时
注册时间
2019-2-20
最后登录
2024-7-16
上尉
帖子
1013
积分
1228
技术
14
捐助
0
注册时间
2019-2-20
18
楼
发表于 2021-12-26 21:28
|
显示全部帖子
回复
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
5i365
发短消息
加为好友
5i365
(我心飞扬)
当前离线
UID
92265
帖子
1013
精华
0
积分
1228
PB
1186
技术
14
捐助
0
阅读权限
50
在线时间
916 小时
注册时间
2019-2-20
最后登录
2024-7-16
上尉
帖子
1013
积分
1228
技术
14
捐助
0
注册时间
2019-2-20
19
楼
发表于 2021-12-27 13:35
|
显示全部帖子
回复
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
5i365
发短消息
加为好友
5i365
(我心飞扬)
当前离线
UID
92265
帖子
1013
精华
0
积分
1228
PB
1186
技术
14
捐助
0
阅读权限
50
在线时间
916 小时
注册时间
2019-2-20
最后登录
2024-7-16
上尉
帖子
1013
积分
1228
技术
14
捐助
0
注册时间
2019-2-20
20
楼
发表于 2021-12-27 17:46
|
显示全部帖子
回复
28#
idwma
这行就是 实例文件 蓝莲花.musicxml 中的第二行
这是一个我做的音乐谱子文件, 里面有特定的标签 ABC 都做错了,
我可以打开谱子软件去手动删除它, 但是我还要去找, 所以就右键用记事本打开看了一下, 发现是xml文件, 然后印象中powershell可以处理xml文件, 就找了一些贴子和资料,想试试, 能不能用powershell删除那个标签
要处理的谱子文件不是很多, 手动删除半个小时也能做完, 但对powershell感点兴趣, 也顺便看看能不能让脚本能力得到提升
TOP
5i365
发短消息
加为好友
5i365
(我心飞扬)
当前离线
UID
92265
帖子
1013
精华
0
积分
1228
PB
1186
技术
14
捐助
0
阅读权限
50
在线时间
916 小时
注册时间
2019-2-20
最后登录
2024-7-16
上尉
帖子
1013
积分
1228
技术
14
捐助
0
注册时间
2019-2-20
21
楼
发表于 2021-12-27 19:19
|
显示全部帖子
回复
30#
idwma
这样解析时不报错了
[xml]$a = Get-Content ".\蓝莲花.musicxml" -Encoding UTF8
TOP
5i365
发短消息
加为好友
5i365
(我心飞扬)
当前离线
UID
92265
帖子
1013
精华
0
积分
1228
PB
1186
技术
14
捐助
0
阅读权限
50
在线时间
916 小时
注册时间
2019-2-20
最后登录
2024-7-16
上尉
帖子
1013
积分
1228
技术
14
捐助
0
注册时间
2019-2-20
22
楼
发表于 2021-12-27 19:22
|
显示全部帖子
回复
30#
idwma
试了一下, 这样可以找到爷结点, 但是还是删除不干净, 还是留下了标签
$b = $a.SelectSingleNode("//rehearsal[text()='ABC']")
$b.ParentNode.ParentNode.RemoveAll()
TOP
5i365
发短消息
加为好友
5i365
(我心飞扬)
当前离线
UID
92265
帖子
1013
精华
0
积分
1228
PB
1186
技术
14
捐助
0
阅读权限
50
在线时间
916 小时
注册时间
2019-2-20
最后登录
2024-7-16
上尉
帖子
1013
积分
1228
技术
14
捐助
0
注册时间
2019-2-20
23
楼
发表于 2021-12-27 19:24
|
显示全部帖子
回复 5i365
那这样呢,不需要知道节点的信息了
idwma 发表于 2021-12-26 20:22
这种不稳, 实例中, 把好多地方都删除了
TOP
5i365
发短消息
加为好友
5i365
(我心飞扬)
当前离线
UID
92265
帖子
1013
精华
0
积分
1228
PB
1186
技术
14
捐助
0
阅读权限
50
在线时间
916 小时
注册时间
2019-2-20
最后登录
2024-7-16
上尉
帖子
1013
积分
1228
技术
14
捐助
0
注册时间
2019-2-20
24
楼
发表于 2021-12-27 19:27
|
显示全部帖子
回复
30#
idwma
我感觉下面这种可能也不稳, 所以想找上面那种结点的方法来删除:
$b = $a.SelectSingleNode("
//*[./.='ABC']
")
TOP
5i365
发短消息
加为好友
5i365
(我心飞扬)
当前离线
UID
92265
帖子
1013
精华
0
积分
1228
PB
1186
技术
14
捐助
0
阅读权限
50
在线时间
916 小时
注册时间
2019-2-20
最后登录
2024-7-16
上尉
帖子
1013
积分
1228
技术
14
捐助
0
注册时间
2019-2-20
25
楼
发表于 2021-12-27 19:47
|
显示全部帖子
本帖最后由 5i365 于 2021-12-27 19:49 编辑
回复
30#
idwma
实例中下面这种匹配真出错了 , 我不再找文本是 ABC 的,换成了找是 A 的, 结果把别的地方的A也删除了,
$b = $a.SelectSingleNode("//*[./.='A']"
看来至少要限定A所在的标签, 下面这样可以定位所在标签了, 但没有办法删除爷标签
:
$b = $a.SelectSingleNode("//
rehearsal
[./.='A']"
TOP
5i365
发短消息
加为好友
5i365
(我心飞扬)
当前离线
UID
92265
帖子
1013
精华
0
积分
1228
PB
1186
技术
14
捐助
0
阅读权限
50
在线时间
916 小时
注册时间
2019-2-20
最后登录
2024-7-16
上尉
帖子
1013
积分
1228
技术
14
捐助
0
注册时间
2019-2-20
26
楼
发表于 2021-12-28 08:15
|
显示全部帖子
回复
36#
idwma
如何让a这个文本不区分大小写? 这个只能找小a
$a.SelectSingleNode("//*[*/rehearsal='a']")
TOP
5i365
发短消息
加为好友
5i365
(我心飞扬)
当前离线
UID
92265
帖子
1013
精华
0
积分
1228
PB
1186
技术
14
捐助
0
阅读权限
50
在线时间
916 小时
注册时间
2019-2-20
最后登录
2024-7-16
上尉
帖子
1013
积分
1228
技术
14
捐助
0
注册时间
2019-2-20
27
楼
发表于 2021-12-28 18:18
|
显示全部帖子
回复
38#
idwma
多谢
TOP
 
1
2
返回列表
批处理专区: BAT CMD DOS
BAT求助&讨论
BAT教程&资料
BAT原创&转载
BAT新大陆
BAT转载代码
新手练功
出题挑战
有偿求助
第三方命令行
开源原创工具
iBAT
Take Command
其他脚本区
PowerShell求助&讨论
PowerShell教程&资料
PowerShell原创&转载
VBS求助&讨论
JS / JScript / JavaScript
VBS教程&资料
VBS原创&转载
UNIX/Linux Shell
Python
Perl
网络资源区
电脑技术研讨
精品软件交流
论坛事务区
站务交流
意见反馈
论坛公告
版主申请
交换链接
建站杂谈
活动专区
论坛总版规
[收藏此主题]
[关注此主题的新回复]
[通过 QQ、MSN 分享给朋友]