регулярное выражение для замены атрибута xml - PullRequest
3 голосов
/ 23 апреля 2009

У меня есть XML-файл вида:

<property name="foo" value="this is a long value">stuff</property>

Есть много свойств, но я хочу сопоставить одно с именем foo, а затем заменить его атрибут значения на что-то еще, как:

<property name="foo" value="yet another long value">stuff</property>

Я думал написать регулярное выражение, чтобы все соответствовало после "foo" до конца тега (">") и заменить его, но я не могу понять синтаксис правильно.

Я пытаюсь сделать это с помощью sed, если это поможет.

Ответы [ 3 ]

7 голосов
/ 23 апреля 2009

/property name=\"foo\" value=\"([^\"]*)\"/

Тогда просто замените первый субматч новым значением вашего желания.

5 голосов
/ 23 апреля 2009

Вы, вероятно, не хотите использовать регулярное выражение для манипулирования XML-файлом. Вместо этого рассмотрим xslt , который знает о правилах xml и не приведет к искажению вашего преобразованного документа.

0 голосов
/ 18 июня 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...