2014-03-27 34 views
1

我的XML:最好的方法在XML元素匹配屬性值

< measValue dn="Cabinet=0, Shelf=0, Card=2, Host=0"> 

    < r p="1">1.42</r> 

    < r p="2">2.28</r> 

< /measValue> 

我想用不同的模式相匹配的getAttribute( 「DN」)像

1>Host=0#這是很容易

我的解決方案:

if (getAttribute("dn")=~ /Host=0/) 

2>Host=0 && Card=2

我能做到這一點但我需要匹配兩次像

if (getAttribute("dn")=~ /Host=0/) && (getAttribute("dn")=~ /Card=2/) 

有沒有什麼更好的方法來幫兇本場比賽第二個模式?使用的libxml

回答

1

有一試:

if (getAttribute("dn")=~ /^(?=.*\bHost=0\b)(?=.*\bCard=2\b)/) 

詞的邊界\b來這裏是爲了避免匹配myHost=01和一切類似。

+0

這是有幫助的!作品!謝謝! – marks

+0

哎呀!剛剛意識到,它也會匹配Card = 22!這是不正確的 – marks

+0

謝謝!我的問題在這裏問一個愚蠢的問題...這很容易它適用於\ b – marks

0

你的方法有問題,getAttribute("dn") =~ /Card=2/也會匹配值Card=25這可能不是你想要的。

我會先寫一個字符串鍵/值對轉換爲哈希幫手:

sub key_value_pairs_to_hash { 
    my $string = shift; 
    my %hash; 

    for my $pair (split(/\s*,\s*/, $string)) { 
     my ($key, $value) = split(/\s*=\s*/, $pair, 2); 
     $hash{$key} = $value; 
    } 

    return \%hash; 
} 

然後可以測試這樣的值:

my $hash = key_value_pairs_to_hash('Cabinet=0, Shelf=0, Card=2, Host=0'); 

if ($hash->{Host} == 0 && $hash->{Card} == 2) { 
    print("match\n"); 
} 
+0

有道理!但是還有另一個痛苦,在這裏屬性匹配的數量是可變的。我可能會得到2個值匹配或只有一個值匹配。即我可能只得到卡匹配或主機和卡都匹配。我可以保留這個在一些數組中匹配一次只爲所有? – marks

+0

是的,您可以將要匹配的值存儲在數組或哈希中。如果您遇到問題,請提出一個單獨的問題。 – nwellnhof

相關問題