在XML文件中查找用户并返回变量 - 第二次尝试

时间:2014-08-11 18:31:46

标签: xml perl

我最后一次寻求帮助时,并没有找到正在寻找的东西。相反,我更多地谈论了我的非格式化的XML。因此,请允许我再次尝试描述我的问题:

我的客户公司正在使用一个巨大的XML文件,其中包含测试部门,包括这些测试部门的用户等。一个名为“Fighters”的部门的摘录看起来如下(复制1:1(但名称和数字不同)):

<config name="department" version="1.11">
     <xad version="1459" nocheckoutver="1701">
        <!-- ... -->
        <department name="/fighters" id="123879" group="channel" case="none" use="no">
            <replication region="4334">
                <options index_name="index.html" listing="0" sum="no" allowed="no" />
                <!-- ... -->
            </replication>   
            <target prefix="http" suffix=".net" />
            <!-- ... -->
            <user name="T:106603" />
            <user name="T:123879" />
            <user name="test" />
            <user name="ele::123456" />
            <user name="company-temp" />
            <user name="companymw2" />
            <user name="bird" />
            <user name="coding11" />
            <user name="plazamedia" />
            <allow go="123456=abcdefghijklmnopqrstuvwxyz" />    
            <!-- ... -->
        </department>
        <department name="/dancers" id="876543" group="floor" case="yes" use="no">
            <!-- ... -->
        </department>
    <!-- ... -->    
    </xad>
</config>    

每个测试部门都面临一个唯一的ID(此处123879)。

所以我想通过搜索department-id(包含在“”中)来获取存储在变量中的所有用户的数量。命令如何看起来像

注意:部门中的用户数量各不相同,而部门ID也存储在变量中,我们称之为$dept

非常感谢您提供解决方案,并且我仍然耐心地使用bash编程。请注意:如果解决方案是运行,例如一个Perl脚本我也很感激为此获取相关代码。

2 个答案:

答案 0 :(得分:1)

如果我将您的数据修改为格式良好的XML(见下文),您可以使用xmlstarlet之类的工具来处理它

$ xmlstarlet sel -t -v '//department[@id="123879"]/user/@name' -n file.xml 
T:106603
T:123879
test
ele::123456
company-temp
companymw2
bird
coding11
plazamedia
$ xmlstarlet sel -t -v '//department[@id="123879"]/user/@name' -n file.xml |wc -l
9

XML:

<config name="department" version="1.11">
     <xad version="1459" nocheckoutver="1701">
        <!-- ... -->
        <department name="/fighters" id="123879" group="channel" case="none" use="no">
            <replication region="4334">
                <options index_name="index.html" listing="0" sum="no" allowed="no" />
                <!-- ... -->
            </replication>   
            <target prefix="http" suffix=".net" />
            <!-- ... -->
            <user name="T:106603" />
            <user name="T:123879" />
            <user name="test" />
            <user name="ele::123456" />
            <user name="company-temp" />
            <user name="companymw2" />
            <user name="bird" />
            <user name="coding11" />
            <user name="plazamedia" />
            <allow go="123456=abcdefghijklmnopqrstuvwxyz" />    
            <!-- ... -->
        </department>
        <department name="/dancers" id="876543" group="floor" case="yes" use="no">
            <!-- ... -->
        </department>
    <!-- ... -->    
    </xad>
</config>

xmlstarlet可以从http://xmlstar.sourceforge.net/download.php

下载

答案 1 :(得分:1)

我更喜欢XML :: LibXML。它快速而强大。

您说您希望统计所有用户,但随后指定要使用的部门ID。我不确定你想要哪一个,所以我会提供两者。

统计所有用户:

my $num_users = 0;
for my $users ($doc->findnodes("/config/xad/department/users")) {
   ++$num_users;
}

计算指定部门中的用户:

for my $dept ($doc->findnodes("/config/xad/department[@id='$dept_id']")) {
   my $num_users = 0;
   for my $user ($dept->findnodes("users")) {
      ++$num_users;
   }
}