如何在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
相关产品推荐
相关产品推荐

