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