我最后一次寻求帮助时,并没有找到正在寻找的东西。相反,我更多地谈论了我的非格式化的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脚本我也很感激为此获取相关代码。
答案 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;
}
}