PowerShell实现合并XML文件后id_bloku编号的全局连续重排
合并XML后重排id_bloku连续编号的实现方案
之前操作失效的核心原因
- 配合
ForEach-Object用-replace处理时,正则本身没有按文档顺序逐次计数的能力,遇到3个文件重复的1-120编号,全局匹配会直接把所有相同编号的内容一次性替换,完全没法按节点出现的先后顺序重排 - 用
$var++自增的常见错误:要么把计数器定义在循环体内部,导致每次循环都把计数重置为初始值;要么先执行自增再给属性赋值,导致第一个节点编号从2开始,整体序列偏移、首尾错号
正确操作步骤(PowerShell实现)
- 用XML文档对象加载文件,避免纯文本解析损坏原有格式
# 替换为实际的合并XML文件路径 $xmlDoc = [xml](Get-Content -Path "C:\你的文件路径\merged.xml" -Raw -Encoding UTF8) # 初始化计数器,从1开始计数 $currentId = 1 - 按文档顺序遍历所有目标节点,更新属性值
# 匹配所有带id_bloku属性的III节点 foreach ($blockNode in $xmlDoc.SelectNodes("//III[@id_bloku]")) { # 先赋值再自增,保证第一个节点拿到初始值1 $blockNode.id_bloku = $currentId.ToString() $currentId++ } - 保存修改后的文件
$xmlDoc.Save("C:\你的文件路径\merged.xml")
效果说明
按照示例的节点顺序处理后,原本重复的1、2、3编号序列会被替换为连续的1、2、3、4、5、6、7、8、9,对应3个原文件拼接的顺序。如果总节点数是3*120=360个,最终最后一个节点的id_bloku值会刚好为360,无断号、无重复。
容易踩的坑
- 不要把
$currentId = 1写在foreach循环内部,否则每次循环计数器都会重置,所有节点的属性值都会被设为1 - 不要把自增操作放在赋值前面(比如先写
$currentId++再给属性赋值),否则第一个节点拿到的编号会是2,整体序列从2开始,最后会多算出1个编号导致最后值变成361 - 不要用纯文本正则做全局替换,一旦XML的文本内容里出现和id_bloku属性值相同的字符串,会被误替换破坏原有内容
内容的提问来源于stack exchange,提问作者user15007921
相关产品推荐
相关产品推荐

