2016-12-08 1 views
1

ログインしてセッションIDを返すスクリプトがあります。セッションIDが必要なので、XMLファイルにデータを埋め込んで、たとえば保育園用の工場の部屋を作成することができます。私は同じスクリプトでplant_root_add XMLを置くことができることを知っているが、私はこれを考える変数を抽出して別のXMLファイルに追加します

<xml> 
    <API>4.0</API> 
    <action>plant_room_add</action> 
    <enforce_rules_training>0</enforce_rules_training> 
    <id>3</id> 
    <location>123456</location> 
    <name>Test1</name> 
    <sessionid>$sessionid</sessionid> 
    <signature>Hello World</signature> 
    <terminal_id>xxxxxxx</terminal_id> 
    <training>1</training> 
</xml> 

:私はそのセッションIDの変数を取ると、次のようになり、別のXMLファイルに挿入する必要があります

#!/usr/bin/perl -w 

use strict; 

use LWP::UserAgent; 
use Data::Dumper; 
use XML::Simple; 

my $authenticate = do { 
    open my $fh, '<', '/tmp/login.xml' or die "Could not open file: $!"; 
    local $/; 
    <$fh>; 
}; 

my $webpage = "https://www.example.com/api"; 

my $ua = LWP::UserAgent->new; 
my $response = $ua->post($webpage, Content_Type => 'text/xml', 
             Content => $authenticate); 


if ($response->is_success) { 

    my $xml = new XML::Simple; 
    my $x = $response->decoded_content; 

    # read XML file 
    my $data = $xml->XMLin($x); 

    my $sessionid = $data->{'sessionid'}; 

... 

スクリプトは時間が経つにつれて成長していますので、プラントルームを削除するためのスクリプトが必要な場合があります。これは監視用で、60秒ごとに実行されます。

どうすればいいですか?

答えて

4

XML::Simpleを使用しないでください。 XML::LibXMLXML::Twigの両方が、言い換えれば、はるかに優れています。

最初の(未知の)XMLからデータを取得する方法を示すことはできませんが、XML::LibXMLを使用してXMLファイル "another"を編集する方法があります。このモジュールで最初の操作を書き直すことをお勧めします。

XPath式でノードを検索し、要素のテキストノードの子であるremoveとaddを置き換えます。これに最も関連XML::LibXML

use warnings; 
use strict;  
use XML::LibXML; 

# ... your code that establishes the $session_id variable ... 
my $session_id = 'SAMPLE_ID'; 
my $filename = 'another.xml'; 

my $doc = XML::LibXML->load_xml(location => $filename); 

my ($node) = $doc->findnodes('//sessionid'); 
$node->removeChildNodes(); 
$node->appendText($session_id);  

# print $doc->toString; 
$doc->toFile('edited_' . $filename); # or just $filename to overwrite 

ドキュメントはTextNodeElementクラスのためです。 ParserおよびDocumentのページも参照してください。ここにはXPathspecificationtutorial (w3schools)があります。


いくつかのコメント。

の代わりに直接ファイルをロードし、我々はより多くの柔軟性を提供するもの、我々はコンストラクタ(stilll解析の前にしばらく)のits configuration外のための方法を使用することができる一方で、パーサでパーサオブジェクト最初

my $parser = XML::LibXML->new(); 
my $doc = $parser->parse_file($filename); 

を作成することができます。

目的に応じて、データを変更する方法は他にもあります。例えば、

$node->firstChild->setData($session_id); 

がより具体的である。ノードに子が、この関数は子リストの最初のノードを返しますノードがある場合はそれはXML::LibXML::Node

からfirstChildを使用しています。 XML::LibXML::Text

この関数セットから

及びsetDataまたはノードにテキストコンテンツを置き換えます。ノードは、 "text"、 "cdata"または "comment"のタイプでなければなりません。

これは、1つの子 "の最初のノードである"に適用されます。

テキストノードをfindnodes('//sessionid/text()')で取得し、要素が子を持つ場合はsetData(その1つの子ノード上)を直接使用することもできます。あなたはおそらく答えのようにしたいと思います。

+0

これはトリックでした! – BioRod

+0

@BioRodそれを聞いてうれしい:)何かが現れたら教えてください。 – zdim

関連する問題