我有一个以下形式的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,如果这有任何帮助。
答案 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很有用,同时利用浏览器的健壮性。