请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

对字符串的指定的ID值作批量替换

老师,这个提问是来源于我目前工作中遇到的一个需求,简化为就是对拿到的XML字符串作拷贝,先生成和原XML一样的字符串,然后要对新的XML中的id值作批量替换,像我截图中的 id=“Activity_1111”, 替换为 id=“Activity_2222222”, 只是同时,也要把 bpmnElement=“Activity_1111”,替换成 bpmnElement=“Activity_2222222”,因为 id会被其它元素所引用,所以一个id替换了,与之关联的被引用的id值也要同步替换。我的方法是分成两步来走: 1. 先取到字符串中所有id值 let arr1 = [Activity_1111, ShapeR_23145, Event_89012, …] //问下老师,这种你会用什么办法去取 2. 根据arr1数组,再生成一个arr1同大小的数组,令 let arr2 = arr1; 然后对arr2中每个元素生成另一个对应的id值,最后再拿arr2数组去更新xml字符串. 我想向老师讨教您的解决思路 : )

let xml = `<Root id="Activity_1111" >
	<Rect id="ShapeR_23145" ></Rect>
	<EventShape id="Event_89012" bpmnElement="Activity_1111"></EventShape>
	<Flow id="Flow_0712109" sourceRef="ShapeR_23145" targetRef="Event_89012" />
</Root>`
// 1. 先取到字符串中所有id值 let arr1 = [Activity_1111, ShapeR_23145, Event_89012, ...] 
let arr1 = ['Activity_1111', 'ShapeR_23145', 'Event_89012'] //问下老师,这种你会用什么办法去取   
// 2.  根据arr1数组,再生成一个arr1同大小的数组
let arr2 = arr1.map(s=>{
	let [name, num] = s.split('_');
	let randNum = Math.random()+''
	// Activity_1111=>Activity_xxxxxx(自己随机生成的数字)
	let newNum = randNum.substring(randNum.length - 5)
	return name+'_'+newNum;
});
// 3. 用arr2去填充原来的xml中相应的id
for(let i = 0; i < arr1.length; i ++){
	xml = xml.replaceAll(arr1[i], arr2[i]);/// arr2[i] 去替换 arr1[i]
}
// 至此 xml就完成了批量替换
<!-- 原来的xml -->
<Root id="Activity_1111" >
	<Rect id="ShapeR_23145" ></Rect>
	<EventShape id="Event_89012" bpmnElement="Activity_1111"></EventShape>
	<Flow id="Flow_0712109" sourceRef="ShapeR_23145" targetRef="Event_89012" />
</Root>

<!-- 需要对上述的xml中的id值(id中的数字部分作替换), 像下方 -->
<Root id="Activity_2222222" >
	<Rect id="ShapeR_333333" ></Rect>
	<EventShape id="Event_444444" bpmnElement="Activity_2222222"></EventShape>
	<Flow id="Flow_55555555" sourceRef="ShapeR_333333" targetRef="Event_444444" />
</Root>

图片描述

正在回答 回答被采纳积分+3

插入代码

1回答

liuyubobobo 2023-06-14 23:50:57

我可能看问题描述看的不是特别仔细(但非常感谢你努力把问题描述得如此清晰)。


猛地看应该使用正则表达式解决。


继续加油!:)

0 回复 有任何疑惑可以回复我~
  • 提问者 甲骨文_0001 #1
    下午拿到的需求,晚上想了想,然后刚刚就在上面更新了代码。嗯嗯,我会用正则取到所有IDs,然后再用str.replaceAll去完成替换。如果不用正则,纯字符串解析,像这种提取 ID串的方法是不是就会很麻烦,想趁这个问题问下老师。
    回复 有任何疑惑可以回复我~ 2023-06-14 23:58:03
  • liuyubobobo 回复 提问者 甲骨文_0001 #2
    是的。而正则表达式本质就是把这类字符串的问题“封装成了一个工具”,直接使用就好。很多字符串算法,都被封装在了正则表达式这个工具的内部。
    回复 有任何疑惑可以回复我~ 2023-06-15 00:02:12
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号