最好的方法在XML元素匹配属性值

问题描述:

我的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

有一试:

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

词的边界\b来这里是为了避免匹配myHost=01和一切类似。

+0

这是有帮助的!作品!谢谢! – marks

+0

哎呀!刚刚意识到,它也会匹配Card = 22!这是不正确的 – marks

+0

谢谢!我的问题在这里问一个愚蠢的问题...这很容易它适用于\ b – marks

你的方法有问题,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