正则表达式替换xml属性

时间:2009-04-23 05:55:13

标签: regex

我有一个以下形式的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”之后的所有内容到标记的末尾(“&gt;”)并替换它,但我似乎无法使语法正确。

我正在尝试使用sed,如果这有任何帮助。

3 个答案:

答案 0 :(得分:7)

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

然后只需用您希望的新值替换第一个子匹配。

答案 1 :(得分:5)

您可能不希望使用正则表达式来操作xml文件。请改为考虑xslt,它知道xml规则并且不会导致转换后的文档格式错误。

答案 2 :(得分:0)

如果您是在浏览器的上下文中执行此操作,则可以创建一个包含XML的一次性DOM节点,然后单击该节点以替换属性值。

此函数将在每个子节点上调用回调:

const walkDOM = (node, callback) => {
  callback(node);
  [...node.children].forEach(child => {
    walkDOM(child, callback)
  });
}

然后,您可以使用此更新符合条件的任何属性(此处替换任何属性,假设您有一个名为svgXml的XML字符串:

  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很有用,同时利用浏览器的健壮性。