2016-09-13 22 views
1

私はタグが<test>Value</test>であるxmlを持っています。タグの値を取得したいと思います。私はPerl正規表現でそれをしたいです 以下は私のXMLサンプルです:Perlの正規表現からXmlタグ値を取得する

<?xml version="1.0"?> 
<t_volume> 
<test>Value</test> 
<info> 
<info_name>FZGA34177.b1</info_name> 
<center_project>4085729</center_project> 
<base_file>SETARIA_ITALICA/JGI/fasta/FZGA34177.b1.fasta</base_file> 
</info> 
</t_volume> 

このタグの値を取得したいと思います。<test>Value</test>。私は試しましたが、値を取得できません。それは返す場合には、XMLで

$data = ($xml =~/<test>(.*?)<\/test>/i); 

私はRequestorId

答えて

1

$xml =~/<test>(.*?)<\/test>/i式の値を得ることができる方法も

<Test RequestId="1" RequestorId="test" ResponderId="Test"> 

のようなXMLを取得していますが、リストコンテキストで評価することができますすべてのキャプチャされたグループとの配列。ですから、そのようなことを実行する必要があります。

($data) = $xml =~/<test>(.*?)<\/test>/i; 

編集:あなたは括弧のセットでそれをキャプチャする場合には、第2たとえば、あなたが同様の情報を抽出することができます

($RequestorId) = $xml =~ /<Test [^>]*\bRequestorId="([^"]*)"/; 
+0

:あなたの第二のために

#!/usr/bin/env perl use strict; use warnings; use XML::Twig; my $twig = XML::Twig -> new -> parsefile ('your_file.xml'); print $twig -> get_xpath('//test',0) -> text; 

:あなたの最初のために

print $twig -> get_xpath('//Test',0) -> att('RequestorId'); 

これは、ワンライナー、IFYすることができます= "test" ResponderId = "Test">。これからRequestorIdの値を取得したいのですがどうすればいいのですか? – Developer

+0

私の質問も更新しました – Developer

+0

@Developer答えを更新しました。 – redneb

2

ドン」正規表現を使用してXMLを解析するすなわちXML::LibXML、適切なXML処理ツールを使用してください:XMLがどこにある正規表現は、文脈ではないので

#!/usr/bin/perl 
use warnings; 
use strict; 
use feature qw{ say }; 

use XML::LibXML; 

my $dom = 'XML::LibXML'->load_xml(location => shift); 

my $data = $dom->findvalue('t_volume/test'); 
say $data; 

my $requestor_id = $dom->findvalue('//Test/@RequestorId'); 
say $requestor_id; 
2

正規表現は、XMLで使用するbad ideaです。問題は、XMLの意味論的に同一の部分の束が合法的に変わる可能性があり、regexを飛び越えることです。アップストリーム(合法的な、スペック内の)変更のためにある日中断するかもしれないので、そうすることによって脆いコードを作成します。

例えば:

<root> 
<Test RequestId="1" RequestorId="test" ResponderId="Test"> 
</Test> 
</root> 

または:

<root> 
    <Test RequestId="1" RequestorId="test" ResponderId="Test"></Test> 
</root> 

または:

<root> 
    <Test 
     RequestId="1" 
     RequestorId="test" 
     ResponderId="Test"></Test> 
</root> 

または:

<root 
><Test 
RequestId="1" 
RequestorId="test" 
ResponderId="Test" 
></Test></root> 

または:

<root> 
    <Test RequestId="1" RequestorId="test" ResponderId="Test"/> 
</root> 

これらはすべて、意味的に同じですが、私はあなたのハード安全に(あなたがに実行するかもしれないし、他のもの)上記のすべてを扱うregexで押されると思いますかなり確信して

さらに、

  • ドキュメントツリーの他の場所でも同様に一致します。 (多くの場合、Test要素)
  • 属性の順序付け/存在の変更。 (したがって、マッチはそれ以上働かない)。
  • <Test>サブ要素を持つ要素です。ワイルドカードを使用しているため、属性ではなくサブ要素がキャッチされます。幸い

、あなたは代替持っている - xpath - 式を定義する方法、ビットregexのような、しかしXML承知のように動作します。

私はXML::Twigを提案します。これは、特に急な学習曲線がないためです。私は<試験RequestId = "1" RequestorIdのデータを得た場合

perl -MXML::Twig -0777 -e 'print XML::Twig -> parse (<>) -> get_xpath("//test",0) -> text' yourfile 
関連する問題