Удалить пробелы из тегов XML - PullRequest
4 голосов
/ 02 августа 2011

Я пытаюсь написать Perl-скрипт, который удаляет пробелы из тегов XML, но оставляет пробелы внутри значений.Например, допустим, у меня есть:

<Example>This is an example.</Exampl   e>

Что я хочу сделать, так это стереть пробел специально в </Exampl e>.Поскольку это будет работать со всем документом XML, я решил, что что-то сделаю с оператором подстановки, но не могу понять, как сопоставить только те пробелы, которые могут быть внутри самих тегов XML.

Любая помощь очень ценится!

Редактировать: Я добавил реальный пример того, что происходит:

not well-formed (invalid token) at line 42, column 25, byte 1456:
                    <Artist>Eminem</Artist>
                    <FileName>eminem feat lil wayne - no love -
hotnewhiphop com(2).mp3</    FileName>
========================^
                    <FileSize>4804478</FileSize>

Ответы [ 2 ]

3 голосов
/ 02 августа 2011
s!(</?\w+)\s+(\w+\s+/?>)!$1$2!g;

Если вы действительно хотите оставить пробел в теге с атрибутами, он становится более сложным, потому что пробел является допустимым символом в теге.Вы в значительной степени должны найти «слова» без равных или пробелов + равных после них и объединить их с предыдущим - без кавычек - слово.

sub marry_inner_splits {
    my $_ = shift;
    # fix broken tags
    s|^/?(\w+)\s+(\w+)\b(?!\s*=)|$1$2|; 
    # find the resulting position.
    my $pos = index( $_, ' ' );
    # return if there is no whitespace.
    return $_ if $pos == -1;
    # bind the rest of the text to the substring
    substr( $_, $pos ) =~ s/(\s*\w+)\s+(\w+\s*=\s*(?:"[^"]+"|'[^']+')\s*)/$1$2/g;
    return $_;
}

my $tag_str = q{Some stuff before the tag <ta g attr1="val1" att   r2="value #2"     /></Escap   e>};
$tag_str =~ s/<([^>]+)>/'<' . marry_inner_splits($1) . '>'/ge;

e флаг означает, что вы *eval* - в запасной части.

1 голос
/ 02 августа 2011

Я настоятельно рекомендую избегать разбора собственного XML-анализа или пытаться манипулировать XML с помощью регулярных выражений и т. Д.

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

Например, посмотрите на XML :: Easy , XML :: Smart , XML :: TreeBuilder , XML :: Twig .

См. Также http://perl -xml.sourceforge.net / faq / , чтобы получить исчерпывающие ответы на часто задаваемые вопросы по обработке XML с помощью Perl.

...