2017-03-14 4 views
0

は、私は、文字列の入力を持って存在しない可能性があります。Perlの正規表現のマッチング:キーワードは、以下のような

<Name>IncludeLeafPortfolios</Name><DataType>Boolean</DataType><Value>True</Value> 
<Name>HierarchyDate</Name><DataType>Int</DataType><IsFixed>false</IsFixed> 
<Name>HierarchyDate</Name><DataType>Int</DataType> 
<Name>HierarchyDate</Name><DataType>Int</DataType><Value>0</Value><IsFixed>false</IsFixed> 
<Name>HierarchyDate</Name><DataType>Int</DataType><Value>0</Value><IsFixed>false</IsFixed> 

名前タグが常に存在し、関心があります。 DataTypeは重要ではありません。 値タグとIsFixedタグが存在する場合と存在しない場合があります。目標はValueタグ、IsFixedタグのいずれかが存在する場合、またはその両方が存在する場合にキャプチャすることです。

私のソリューションが動作していません:示唆

$element =~ m/^<Name>([\w\s]*)<\/Name>.*([<Value>[\w+\d+]<\/Value>]?)(<IsFixed>[\w+]<\/IsFixed>])?$ 

してください。ありがとう。

+0

:あなたは可能性があるため、非常に問題を単純化する

<xml> <item> <Name>HierarchyDate</Name><DataType>Int</DataType><IsFixed>false</IsFixed> </item> </xml> 

、:のようなもの。 i){}カッコをarount。*とすると、ショートカット評価のために両方のタグが存在すれば、最初の値だけを得ることができます。 – Shiping

+0

あなたはそれがあなたのXMLがどのように見えるか_exactly_のですか?それはちょっと奇妙な構造に見えます。 (たとえば、名前要素の '親'ノードが必要です)。 – Sobrique

答えて

0

XMLはコンテキスト依存です。正規表現はありません。この理由から、XMLを正規表現で確実に解析することはできません。

パーサーを使用してください。私はXML::Twig好きで、それが行くだろう。このようなビット:

Name,Value,IsFixed, 
IncludeLeafPortfolios,,, 
HierarchyDate,True,, 
HierarchyDate,,false, 
HierarchyDate,,, 
HierarchyDate,0,false, 

私は、しかし、あなたのXMLが乱雑であることに注意します - あなたはそれはそれは、構造化されます方法です確信しています:出力

#!/usr/bin/env perl 
use strict; 
use warnings; 

use XML::Twig; 
use Data::Dumper; 

my $twig = XML::Twig -> new -> parsefile ('your_file.xml'); 

my @keys = qw (Name Value IsFixed); 

my @rows; 
my %current_row; 
#iterate children 
foreach my $node ($twig -> root -> children) { 
    #extract tag and content 
    my $tag = $node -> tag; 
    my $content = $node -> text; 
    $current_row{$tag} = $content; 
    #if it's a name tag, assume it's a new row. 
    if ($tag eq 'Name' and %current_row) { 
     push @rows, {%current_row}; 
     undef %current_row; 
    } 
} 
#output results. 
print join ",", @keys, "\n"; 
foreach my $row (@rows) { 
    print join ",", (map { $row -> {$_} // '' } @keys),"\n"; 
} 

ので、通常あなたが持っている場合は、「関連する」のタグは、それらはノード内でグループ化しています。

あなたがそれらの少なくとも1つが存在するかどうかを確認することができますが、両方が存在する場合のみ、それらのいずれかをキャプチャすることができます

foreach my $item ($twig -> root -> children) { 
    print join ",", (map { $item -> first_child_text($_) // '' } @keys),"\n"; 
}