在XML元素中匹配Attribute值的最佳方法

时间:2014-03-27 09:46:15

标签: xml regex perl libxml2

我的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(&#34; dn&#34;)与不同的模式匹配,例如

1&GT; Host=0#这很容易

我的解决方案:

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

2 - ; Host=0 && Card=2

我可以但我需要匹配两次

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

有没有更好的方法来帮助这个匹配第二种模式?使用LibXML

2 个答案:

答案 0 :(得分:1)

尝试使用:

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

单词边界\b用于避免匹配myHost=01和类似的所有内容。

答案 1 :(得分: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");
}