Один из вариантов - использование DOMParser и, например, подсчет случаев, когда nodeName
равно SUNDAY
.
Если есть совпадение, замените узел новым узлом через parentNode.
let xmlData = `<?xml version="1.0" encoding="utf-8"?>
<RecipeData>
<SUNDAY Value="1"/>
<SUNDAY/>
<SUNDAY/>
<SUNDAY/>
<MONDAY Value="1">
</MONDAY>
<MONDAY>
</MONDAY>
</RecipeData>`,
search = 'SUNDAY',
n = 2;
parser = new DOMParser();
xmlDoc = parser.parseFromString(xmlData, "text/xml");
let childNodes = xmlDoc.documentElement.childNodes;
let nrSundays = 0;
for (let i = 0; i < childNodes.length; i++) {
if (childNodes[i].nodeName === search) {
nrSundays++;
if (nrSundays === n) {
let childNode = childNodes[i];
childNode.parentNode.replaceChild(xmlDoc.createElement('HHHHH'), childNode);
}
}
}
console.log(new XMLSerializer().serializeToString(xmlDoc.documentElement));
Другим вариантом может быть использование xpath с использованием оценка
let xmlData = `<?xml version="1.0" encoding="utf-8"?>
<RecipeData>
<SUNDAY Value="1"/>
<SUNDAY/>
<SUNDAY/>
<SUNDAY/>
<MONDAY Value="1">
</MONDAY>
<MONDAY>
</MONDAY>
</RecipeData>`,
search = 'SUNDAY',
n = 2;
parser = new DOMParser();
xmlDoc = parser.parseFromString(xmlData, "text/xml");
let nodeSunday = xmlDoc.evaluate(`/RecipeData/${search}[${n}]`, xmlDoc.documentElement, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
nodeSunday.singleNodeValue.parentNode.replaceChild(xmlDoc.createElement('HHHH'), nodeSunday.singleNodeValue);
console.log(new XMLSerializer().serializeToString(xmlDoc.documentElement));
Другой