Regex: держите все в <profession></profession> тегах - PullRequest
0 голосов
/ 03 марта 2010

У меня большой XML, похожий на этот:

<gender>M</gender>
<last-name>*</last-name>
<profession>2165dda2-dc59-41af-acb5-06d8914c4841</profession>
<first-name>*</first-name>
<mail-confirmation>1</mail-confirmation>
<fax-confirmation>1</fax-confirmation>

Я хочу сохранить только теги. Я нашел способ поиска по тегу, как это:

<profession[^>]*>([^<]*?)</profession>

но как мне искать все, что находится за ее пределами? Я попытался просто перевернуть это, как:

</profession[^>]*>([^<]*?)<profession>

или

</profession>([^<]*?)<profession[^>]*>

но это не сработает.

Ответы [ 4 ]

1 голос
/ 24 февраля 2012

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

<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
    <xsl:output method="text" />
    <xsl:template match='/'>
        <xsl:for-each select="person">
          <xsl:value-of select="profession" /><xsl:text>,</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Notepad ++ имеет плагин XML, который будет запускать XSL для открытых файлов. (Плагины> Инструменты XML> Преобразование XSL)

1 голос
/ 03 марта 2010

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

#!/usr/bin/perl

use strict; use warnings;

use XML::LibXML::Reader;

my $reader = XML::LibXML::Reader->new(IO => \*DATA)
    or die "Cannot read from \\*DATA\n";

while ( $reader->read ) {
    print $reader->readInnerXml if $reader->localName eq 'profession';
}

$reader->finish;
print $reader->document->toString(1);

__DATA__
<person>
<gender>M</gender>
<last-name>*</last-name>
<profession>2165dda2-dc59-41af-acb5-06d8914c4841</profession>
<first-name>*</first-name>
<mail-confirmation>1</mail-confirmation>
<fax-confirmation>1</fax-confirmation>
</person>

Выход:

C:\Temp> t
2165dda2-dc59-41af-acb5-06d8914c4841

См. XML :: LibXML :: Reader .

1 голос
/ 03 марта 2010

Строго не получается разобрать XML с помощью регулярного выражения.

Быстрое и грязное решение с помощью sed состоит в том, чтобы найти отличия в профессии, а затем заменить слово «профессия». и "/ ​​профессию" с "" (разметка убирает <>)

0 голосов
/ 03 марта 2010

А как же

# Perl
$xml =~ s/^<profession>.*<\/profession>$/<profession><\/profession>/m;

Просто используйте многострочный модификатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...