基于标签数量用PowerShell拆分XML文件的问题
问题分析与解决办法
你遗漏的核心点:你的脚本只单独处理了
<CPR:employees>节点里的员工标签,完全没管原XML里的根节点以及contractorInfo、projectInfo这些其他顶层结构,相当于把原文件的骨架丢了,只保留了员工这一部分内容。修正的关键步骤:
- 先完整复制原XML的根节点,把除了
<CPR:employees>之外的所有子节点都保留下来,比如contractorInfo、projectInfo这些原封不动拿过来。 - 拆分员工标签后,为每个新文件创建一个全新的
<CPR:employees>节点,把拆分好的员工子集放进去。 - 把这个新的员工节点插入到复制好的根结构里原来员工节点的位置,替换掉原来的完整员工节点。
- 注意命名空间的处理:因为原文件带
CPR命名空间,创建新节点时必须指定相同的命名空间URI,不然生成的XML会结构失效。可以通过原XML的命名空间管理器获取这个URI。
- 先完整复制原XML的根节点,把除了
关键代码片段参考:
# 加载原XML文件 $originalXml = [xml](Get-Content "你的原XML文件路径.xml") # 获取CPR命名空间的URI $nsUri = $originalXml.NamespaceManager.LookupNamespace("CPR") # 复制原根节点(排除原employees节点) $rootTemplate = $originalXml.DocumentElement.Clone() $oldEmployees = $rootTemplate.SelectSingleNode("//CPR:employees", $originalXml.NamespaceManager) $rootTemplate.RemoveChild($oldEmployees) | Out-Null # 提取所有员工节点并按指定数量拆分 $allEmployees = $originalXml.SelectNodes("//CPR:employee", $originalXml.NamespaceManager) $batchSize = 2 # 每个文件的员工数量 $employeeBatches = for ($i=0; $i -lt $allEmployees.Count; $i+=$batchSize) { $allEmployees[$i..([Math]::Min($i+$batchSize-1, $allEmployees.Count-1))] } # 生成每个拆分后的文件 foreach ($idx in 0..($employeeBatches.Count-1)) { # 创建新的XML文档 $newXml = [xml]("<$($rootTemplate.Name) xmlns:CPR=`"$nsUri`" />") # 导入根模板到新文档 $newRoot = $newXml.ImportNode($rootTemplate, $true) $newXml.AppendChild($newRoot) | Out-Null # 创建新的employees节点并添加当前批次的员工 $newEmployeesNode = $newXml.CreateElement("employees", $nsUri) foreach ($emp in $employeeBatches[$idx]) { $importedEmp = $newXml.ImportNode($emp, $true) $newEmployeesNode.AppendChild($importedEmp) | Out-Null } $newRoot.AppendChild($newEmployeesNode) | Out-Null # 保存拆分后的文件 $newXml.Save("拆分结果_$($idx+1).xml") }
内容的提问来源于stack exchange,提问作者crytime
相关产品推荐
相关产品推荐

