如何使用正则表达式替换来扩展XML标记

时间:2017-08-25 08:54:38

标签: regex xml

我有一个服务,它提供一个空的XML文档供我填写。但是,因为在该文档中元素内容为空,所以这些元素标记以缩写形式书写。为了能够填充我必须将标记扩展为开始和结束标记的值。是否可以通过调节表达式替换来实现这一目标?

3 个答案:

答案 0 :(得分:2)

我使用以下正则表达式模式来检测压缩的XML元素,并将其替换为扩展版本:

<([^\s>]+)([^<>]*)(\/>)

替换模板如下所示:

<$1$2></$1>

这种机制相当紧凑。第一组([^ \ s&gt;] +)检测XML元素名称。第二组([^&lt;&gt; * *] 检测所有属性和名称空间(如果适用),最后一组(/&gt;)检测到结束标记紧凑的元素。

<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>

转换为:

<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></CanonicalizationMethod>

答案 1 :(得分:1)

虽然你的答案几乎是正确的,但它没有考虑到几种可能性。

首先,如果所有元素都没有被新行分隔,那么你的正则表达式将匹配整行,以抵消这一点,它需要变得懒惰,我喜欢这样:

<(.*?)\/>

这意味着它将匹配&lt;之间的最短可能表达式。和/&gt;

然后,我们遇到的问题是它会匹配任意数量的普通元素,后跟一个空元素,例如:

<test1></test1></test2/>

因为它仍然匹配第一个&lt;和下一个/&gt;

所以我们需要使用负向前瞻,所以它只匹配一个不包含另一个&gt;的元素。 - 像这样:

<((.(?!>))*?)\/>

然后您的第一个捕获组仍应包含要用

替换的元素的名称
<$1><\/$1>

警告:如果任何元素包含属性,那么它们将包含在结束标记中,这也不会起作用。

答案 2 :(得分:-1)

是。这是可能的。

使用此正则表达式搜索:

<(.*)\/>

这个正则表达式取代:

<$1><\/$1>