You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在XML文件指定行插入带属性的缺失<file>节点?

修复XML缺失节点的xmlStarlet正确方案

问题背景

现有Cobertura格式的XML中,第9、10行的<lineToCover>节点游离在<file>节点外,属于缺失的src/common/test2.go对应的<file>节点,需要精准插入该节点并将这两个行节点纳入其中。原XML结构无效导致xmlStarlet解析报错,之前的命令逻辑错误(将新节点插入到现有file内部)。

错误命令分析

之前的命令使用--subnode "/coverage/file",会将新<file>节点作为现有<file>的子节点,完全不符合需求;同时原XML因游离节点结构无效,触发解析报错。

正确命令

首先确保原XML中的引号均为英文引号(修正中文引号问题),然后执行以下xmlStarlet命令:

xmlstarlet ed \
  # 在第一个file节点后插入新file节点
  --insert "/coverage/file[1]" --type elem -n file -v "" \
  # 为新file节点添加属性
  --insert "/coverage/file[2]" --type attr -n "branch-rate" -v "0.0" \
  --insert "/coverage/file[2]" --type attr -n "complexity" -v "0" \
  --insert "/coverage/file[2]" --type attr -n "path" -v "src/common/test2.go" \
  --insert "/coverage/file[2]" --type attr -n "line-rate" -v "0.0" \
  --insert "/coverage/file[2]" --type attr -n "name" -v "src.common.test2.go" \
  # 将游离的lineToCover节点移动到新file节点内
  --move "/coverage/lineToCover[1]" "/coverage/file[2]" \
  --move "/coverage/lineToCover[1]" "/coverage/file[2]" \
  coverage-so.xml

命令说明

  • --insert "/coverage/file[1]":定位到第一个<file>节点,在其之后插入新的空<file>节点
  • 后续--insert命令为新生成的第二个<file>节点(xpath为/coverage/file[2])添加所有指定属性
  • --move命令依次将两个游离的<lineToCover>节点移动到新<file>节点内部,修正结构

执行后即可得到期望的XML结构,所有<lineToCover>节点均被正确包裹在对应<file>节点下。

内容的提问来源于stack exchange,提问作者AhmFM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 10:17:49