我的文件包含以下内容:
<rdf:RDF
xmlns:rdf="/www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:foaf="/xmlns.com/foaf/0.1/"
xmlns:jfs="//abc.net/xmlns/prod/xyz/jfs/1.0/">
<rdf:Description rdf:about="//alm.com/abc/users/piku">
<foaf:mbox rdf:resource="mailto:piku@disney.com"/>
<foaf:nick>piku</foaf:nick>
<foaf:name>Pallavi Mishra</foaf:name>
<jfs:archived rdf:datatype="//www.w3.org/2001/XMLSchema#boolean"
>false</jfs:archived>
<rdf:type rdf:resource="//xmlns.com/foaf/0.1/Person"/>
</rdf:Description>
</rdf:RDF>
我可以使用perl
或grep
从此文件中提取电子邮件ID“piku@disney.com”并命名为“Pallavi Mishra”。
我的代码是:
my $Name = `cat abc.json | perl -l -ne '/<j.0:name>(.*)<\\/j.0:name>/ and print \$1'`;
my $EmailAddress = `cat abc.json | grep mailto | awk 'BEGIN{FS="\\"|:"} {for(i=1;i<NF;i++) if(\$i ~ /@/) print \$i}'`;
答案 0 :(得分:3)
您应该使用适当的XML解析器,例如XML::LibXML
这个简短的程序展示了这个想法
use strict;
use warnings;
use 5.014; # For non-destructive substitution
use XML::LibXML;
my $doc = XML::LibXML->load_xml(IO => \*DATA);
my $desc = $doc->find('/rdf:RDF/rdf:Description')->get_node(1);
my $mbox = $desc->find('foaf:mbox/@rdf:resource')->string_value =~ s/^mailto://ir;
my $name = $desc->find('foaf:name')->string_value;
print qq{"$name" <$mbox>\n};
__DATA__
<rdf:RDF
xmlns:rdf="/www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:foaf="/xmlns.com/foaf/0.1/"
xmlns:jfs="//abc.net/xmlns/prod/xyz/jfs/1.0/">
<rdf:Description rdf:about="//alm.com/abc/users/piku">
<foaf:mbox rdf:resource="mailto:piku@disney.com"/>
<foaf:nick>piku</foaf:nick>
<foaf:name>Pallavi Mishra</foaf:name>
<jfs:archived rdf:datatype="//www.w3.org/2001/XMLSchema#boolean"
>false</jfs:archived>
<rdf:type rdf:resource="//xmlns.com/foaf/0.1/Person"/>
</rdf:Description>
</rdf:RDF>
<强>输出强>
"Pallavi Mishra" <piku@disney.com>
答案 1 :(得分:1)
不尝试使用您自己的Perl字符串处理来解析XML。这是一个讨厌的不可靠的黑客。
Perl是一种功能强大的语言。您不需要使用shell来帮助Perl解析XML。
use XML::LibXML;
my $foaf = '/xmlns.com/foaf/0.1/';
my $rdf = '/www.w3.org/1999/02/22-rdf-syntax-ns#';
my $doc = XML::LibXML->new->load_xml(location => 'foof.xml');
my $Name = $doc->getElementsByTagNameNS($foaf, 'name')->[0]->textContent;
my $EmailAddress = $doc->getElementsByTagNameNS($foaf, 'mbox')->[0]->getAttributeNS($rdf, 'resource');
$EmailAddress =~ s/^mailto://;
答案 2 :(得分:1)
使用xmlstarlet
:
名称:
xmlstarlet sel -t -v /rdf:RDF/rdf:Description/foaf:name file
对于电子邮件地址:
xmlstarlet sel -t -v "/rdf:RDF/rdf:Description/foaf:mbox/@rdf:resource" file
您可以在第二个语句中添加sed
语句以删除mailto部分:
xmlstarlet ... | sed 's/^mailto://g'