Подсчет узлов с определенным значением - PullRequest
1 голос
/ 23 января 2012

У меня есть xml формата, указанного ниже. Я хотел бы получить число HintPath под Project/ItemGroup/Reference. Мне также нужно получить число Private узлов в Project/ItemGroup/Reference с текстом узла False. Как я могу сделать это с помощью Perl Script?

 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
  <ItemGroup>
    <Reference Include="IronPython, Version= ...">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\shared\IronPython-1.1\IronPython.dll</HintPath>
     </Reference>
     <Reference Include="log4net, Version= ...">
        <SpecificVersion>False</SpecificVersion>
        <HintPath>..\binaries\log4net.dll</HintPath>
        <Private>False</Private>
     </Reference>
    </ItemGroup>
</Project>

Ответы [ 2 ]

2 голосов
/ 23 января 2012

Ниже приведено решение с использованием XML :: Twig.Любой модуль DOM, такой как XML :: LibXML, также будет работать очень похожим образом.

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

my $t= XML::Twig->new->parse( \*DATA);
foreach my $reference ($t->findnodes( '/Project/ItemGroup/Reference'))
  { print "HintPath count: ", $reference->children_count( 'HintPath'), "\n";
    my $private=  $reference->descendants( 'Private[text()="False"]');
    print "False Private count: $private\n";
  }

__DATA__
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
  <ItemGroup>
    <Reference Include="IronPython, Version= ...">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\shared\IronPython-1.1\IronPython.dll</HintPath>
     </Reference>
     <Reference Include="log4net, Version= ...">
        <SpecificVersion>False</SpecificVersion>
        <HintPath>..\binaries\log4net.dll</HintPath>
        <Private>False</Private>
     </Reference>
    </ItemGroup>
</Project>
1 голос
/ 23 января 2012

Вы можете использовать XML :: Simple :

#!/usr/bin/perl

use XML::Simple 'XMLin';

my $xml = XMLin( join( "\n", <DATA> ), ForceArray => [ 'Reference' ] );

foreach my $reference ( @{ $xml->{ItemGroup}{Reference} } )
{
    # count the HintPath and Private (where False) elements in $reference
}

__DATA__
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
         ToolsVersion="3.5">
  <ItemGroup>
    <Reference Include="IronPython, Version= ...">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\shared\IronPython-1.1\IronPython.dll</HintPath>
    </Reference>
    <Reference Include="log4net, Version= ...">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\binaries\log4net.dll</HintPath>
      <Private>False</Private>
    </Reference>
  </ItemGroup>
</Project>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...