Deleting specific string from entire xml file?
-
I know it sounds easy enough but its not in my case. I am trying to edit a massive xml file, Im modding the game “7 Days to Die”. Throughout the file there are strings called <entityGroup=“spiderZombie” prob=“xxx”/> but the prob is a different number in each one. Therefore, I cannot simply search and replace. If i did it would still have to have the remainder, and would leave the end parts prob=“xxx”/> all over the place.
Is there any way, I could replace all of these strings, even though they all have different values within them? It is listed like 600 times in the file, which is why I do not want to manually go through each search result and delete the string. Any help appretiated. ty - team_caffeine
-
Hello, @team-caffeine,
This kind of manipulation is very easily performed, with regular expressions. So :
-
Open your XML file in N++
-
Move back to its very beginning, if necessary (
Ctrl + Origin
) -
Open the Replace dialog (
Ctrl + H
) -
Type, in Find what: zone, the regex
(?-i)<entityGroup="spiderZombie" prob="\d+"/>
-
Let the Replace with: zone
EMPTY
-
Select the Regular expression search mode
-
Click on the Replace All button
Et voilà !
Assuming, for instance, the 7 lines original text, below :
blablablah <entityGroup="spiderZombie" prob="000"/> Other text blablablah <entityGroup="spiderZombie" prob="123"/> Other text blablablah <entityGroup="superHero" prob="999"/> Other text blablablah <entityGroup="spiderZombie" prob="456"/> Other text blablablah <entityGroup="total_Destroyer" prob="10"/> Other text blablablah <entityGroup="spiderZombie" prob="789"/> Other text blablablah <entityGroup="spiderZombie" prob="4589"/> Other text
We would obtain, after global replacement :
blablablah Other text blablablah Other text blablablah <entityGroup="superHero" prob="999"/> Other text blablablah Other text blablablah <entityGroup="total_Destroyer" prob="10"/> Other text blablablah Other text blablablah Other text
Notes :
-
I supposed that search must be sensitive to case. If not, change the modifier
(?-i)
by(?i)
-
I supposed that the prob number is any integer. If it has to be restricted to three digits, only, change the part
\d+
by\d{3}
-
On the contrary, if any string entityGroup is concerned by the suppression, use the regex, below :
(?-i)<entityGroup="\w+" prob="\d+"/>
With this regex, any entityGroup name, containing word characters ( letters, digits, or the low line character
_
) would be matched and suppressed, in replacement, along with the prob string. So, it would give the resulting text :blablablah Other text blablablah Other text blablablah Other text blablablah Other text blablablah Other text blablablah Other text blablablah Other text
Best Regards,
guy038
-
-
Thank you! Im sure this will work, but I am very inexperienced in coding so I still need a little help. The integer is always in the format “0.000”. I tried searching for what you suggested but it did not find anything, however, I don’t know how to change it to where it would find them in this format. All of the values start with 0, and then have three digits after a decimal. So the 3 numbers after the decimal are the only changing factors.
-
The last part of Guy’s expression:
\d+
means 1 or more digits. If you want a digit, a period, and exactly 3 digits, one way is to use this:
\d\.\d{3}
The first \d is for a single digit. The \. is for a period (the period means any character whatsoever unless it has a \ in front of it). The final \d{3} means exactly 3 digits.