2011-02-24 3 views
1

У меня есть регулярное выражение, которое удаляет ссылки xmlns из XML. Он отлично работает, когда есть соответствующие теги, но если ссылка xmlns находится в одном теге, она также удаляет «/».Удалить ссылки пространства имен из XML с помощью Regex

Вот регулярное выражение:

"<(.*?) xmlns[:=].*?>", "<$1>" 

Когда я использую регулярное выражение на этой линии XML:

<ns22:someTagName xmlns:ns22="http://exampledatatypes.com"></ns22:someTagName> 

Я получаю то, что я хочу:

<ns22:someTagName></ns22:someTagName> 

Когда я использую регулярное выражение на этой строке xml:

<ns22:someTagName xmlns:ns22="http://exampledatatypes.com"/> 

Я получаю недопустимый XML:

<ns22:someTagName> 

Он удаляет ссылочный штраф, но это требует закрытия «/» с ним.

Спасибо за помощь, Скотт

+4

Не использовать регулярное выражение для XML. Какой язык программирования вы используете? Несомненно, есть превосходный XML API, который позволит вам легко удалять пространства имен. –

+0

Мы используем LotusScript. – Scott

ответ

5

Вместо того, чтобы сохранить то, что вам нужно от XML, было бы лучше, чтобы предназначаться, что вы хотите удалить.

Это выражение цели только само пространство имен:

\sxmlns[^"]+"[^"]+"

К сожалению, я не знаю, LotusScript, так что я не могу дать вам пример кода, как использовать это, но то, что вы нужно сделать что-то вроде этого psuedocode:

result = regex.replace(yourString, '\sxmlns[^"]+"[^"]+"', '') 

Что вы будете делать здесь заменить все матчи с пустой StrI ng (эффективно удаляя их). Это будет работать как для закрытого, так и для самозакрытого XML-тега, и оно также будет работать, если у тега вообще нет пространства имен.

Edit: Вот полнофункциональный пример Python:

>>> from re import sub 
>>> pattern = r'\sxmlns[^"]+"[^"]+"' 
>>> closed = r'<ns22:someTagName xmlns:ns22="http://exampledatatypes.com"></ns22:someTagName>' 
>>> sub(pattern, '', closed) 
'<ns22:someTagName></ns22:someTagName>' 
>>> selfclosed = r'<ns22:someTagName xmlns:ns22="http://exampledatatypes.com"/>' 
>>> sub(pattern, '', selfclosed) 
'<ns22:someTagName/>' 
+0

Хммм. Я попробовал, и он ничего не видел. В LS вам нужно бежать «с другим». Вот что я пробовал: ExecuteReplace (sXML, "xmlns [^" "] +" "[^" "] +" "", "") – Scott

+0

Привет, Андрей, я получил его на работу, но он оставляет пробелы в где ссылка удалена. Есть ли способ очистить пробел? ExecuteReplace (sXML, "xmlns [^" "] +" "[^" "] +" "", "") – Scott

+0

@Scott - я изменил выражение на это: '\ sxmlns [^"] + "[^" ] + "' для устранения проблемы с пробелами. –

1

Don't use regex on XML if you have access to an XML parser! Это, как говорится, я ничего о возможностях XML парсинга LotusScript (если у него даже есть их) не знаю, так что если вы должны использовать регулярное выражение, это поможет вам ближе:

<([^>]*?)\bxmlns\b[^"']+('|").*?$2(.*?/?>) 

быть заменен:

<$1$3 

Самое важное изменение здесь из вашего исходного регулярного выражения - это /? в конце. Кстати, я не избежал qoutes или обратных косых черт, так как я не знаю синтаксиса LotusScript для этого, и я предполагаю, что вы это делаете.

Всегда будет введенный XML-вход, который не может быть правильно понят этим из-за limitations of regex. Однако он должен работать в большинстве случаев. Вы можете дважды проверить вручную, выполнив поиск строки «xmlns» после этого.

Смежные вопросы