Регулярное выражение для замены атрибута xml
У меня есть XML-файл в форме:
<property name="foo" value="this is a long value">stuff</property>
Существует много свойств, но я хочу сопоставить одно с именем foo, а затем заменить его атрибут value чем-то другим, например:
<property name="foo" value="yet another long value">stuff</property>
Я думал написать регулярное выражение, которое будет соответствовать всему после "foo" до конца тега ( ">") и заменить его, но я не могу понять синтаксис правильно.
Я пытаюсь сделать это с помощью sed, если это поможет.
3 ответа
/property name=\"foo\" value=\"([^\"]*)\"/
Затем просто замените первый субматч новым значением вашего желания.
Вы, вероятно, не хотите использовать регулярные выражения для работы с XML-файлом. Вместо этого рассмотрите xslt, который знает о правилах xml и не заставит ваш преобразованный документ искажаться.
Если вы делаете это в контексте браузера, вы можете создать одноразовый DOM-узел, содержащий XML, и просто пройтись по нему, чтобы заменить значения атрибутов.
Эта функция будет вызывать обратный вызов на каждом дочернем узле:
const walkDOM = (node, callback) => {
callback(node);
[...node.children].forEach(child => {
walkDOM(child, callback)
});
}
Затем вы можете использовать это для обновления любых атрибутов, соответствующих условиям, которые вы хотите (здесь, заменяя любые, при условии, что у вас есть строка XML с именем svgXml
:
const containerEl = document.createElement('div');
containerEl.innerHTML = svgXml;
walkDOM(containerEl, el => {
const attributes = [...el.attributes];
attributes.forEach(attr => {
if (attr.name === 'foo' && attr.value === 'this is a long value']) {
attr.value = 'yet another long value';
}
});
});
const outputSvgXml = containerEl.innerHTML;
Конечно, вы могли бы дополнительно оптимизировать это с помощью querySelectorAll (property
) только гулять <property>
узлы и т. д.
Я нашел это полезным для обновления SVG, используя преимущества надежности браузера.