Регулярное выражение для замены атрибута 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, используя преимущества надежности браузера.

Другие вопросы по тегам