【发布时间】:2016-12-28 11:55:25
【问题描述】:
我正在尝试帮助一位对 EMR(电子病历)系统不满意并想更换但公司表示他们无法从数据库中提取患者人口统计数据的客户(我们询问他们是否可以得到我们csv 文件中的姓名、地址、出生日期(某种非常基本的东西)——但他们声称他们做不到。 (考虑到他们正在使用 sql 数据库,这很疯狂)。 无论如何-他们移交患者的方式是在 xml 文件中,其中大约有 40,000 多个。但它们包含的不仅仅是人口统计数据。 在做了一些研究并在 15 年前完成了广泛的 Perl 编程之后(我承认这些年来它已经生锈了)——我认为这应该是在 Perl 中完成的一项好任务——我遇到了 XML::Twig 模块,它似乎能够做到这一点。 不幸的是,感兴趣的 xml 代码如下所示:
<patient extension="Patient ID Number"> // <--Patient ID is 5 digit number)
<name>
<family>Patient Family name</family>
<given>Patient First/Given name</given>
<given>Patient Middle Initial</given>
</name>
<birthTime value=YEARMMDD"/>
xml 文件中有更多地址等字段。
这是我的代码:
my $twig=XML::Twig->new( twig_handlers => {
'patient/name/family' => \&get_family_name,
'patient/name/given' => \&get_given_name
});
$twig->parsefile('test.xml');
my @fields;
sub get_family_name {my($twig,$data)=@_;$fields[0]=$data->text;$twig->purge;}
sub get_given_name {my($twig,$data)=@_;$fields[1]=$data->text;$twig->purge;}
我可以毫无问题地读取所有具有唯一标签(家庭、城市、邮政编码等)的信息,但 XML:Twig 只返回标签的中间首字母。 例如,如何解决第一次出现的“given”并将其分配给 $fields[1] 并将第二次出现的“given”分配给 $fields[2] - 或者取消中间的首字母。
另外,我如何使用 XML::Twig 提取“Patient ID”或“birthTime”值 - 我找不到对它的引用。 我尝试使用 $data->findvalue('birthTime') 但结果为空。
我查看了:Perl, XML::Twig, how to reading field with the same tag,这非常有帮助,但由于重复的标签位于同一路径中,所以它是不同的,我似乎无法找到答案。 XML::Twig 是否只返回在解析文件时找到匹配项时找到的最后一个值?有没有办法提取所有出现的值?
提前感谢您的帮助!
【问题讨论】:
标签: perl xml-parsing xml-twig