2012-04-27 9 views
1

状況: 現在XML :: LibXMLを使用してXMLからデータを抽出しています。これをXML要素のXpathと組み合わせると、XMLのほとんどの値を読み込んで置き換えることができます。しかし、私はXMLの最初のタグの特定のデータにアクセスすることはできません。それはかなり重要な分野ですが、私はいくつかの方法を試していますが、まだその分野を操作することはできません。Xpath経由でPerlを使用してXMLからデータを抽出する

XMLファイル:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<test **date_time="201111031006"** xsi:noNamespaceSchemaLocation="test.xsd"> 
    <msg_ver>0001</msg_ver> 
    <sender_id>john</sender_id> 
    <recipient_id>mike</recipient_id> 
</test> 

私は(太字)DATE_TIMEフィールドにアクセスしようとしていますが、私はそうするように見える傾けます。私はXPathをコピーして同様に試してみると、うまくいきません。実際にフィールドを変更することはできますが、date_timeフィールドを変更することはできません。私はフィールドからデータを抽出することさえできません。私は同じ機能を使用して、フィールドの変更を読み込み、保存することができます。

マイコード

sub CHANGE_DATE() 
    { 
    my $parser = XML::LibXML->new(); 
    my $doc = $parser->parse_file($newfile); 
    my $query = "/tradenet/@date_time"; ## this is the actual XPATH 
    my($node) = $doc->findnodes($query); 
     $node->setData("$date"); 

    $doc->toFile($newfile); 

これを通して見るのにかかる時間のために事前にありがとう...

答えて

6

あなたのスクリプトの先頭にuse warnings; and use strict;を追加し、それはあなたに問題をご紹介しますクエリ。 (Clue-@date_timeは変数名のように見えます)

次に、tradenetがテストファイルの最上位タグではないことがわかります。

次に、これらを修正すると、setData()が属性に対して正しくないことがわかります。それはsetValue()です。

次に動作します。

このすべては、スクリプトを小さなテストに変換して質問を投稿する前に自分で実行した場合には、自分自身を発見したはずです。

+0

ありがとうございました。私が元のXML文書を分類して編集しなければならなかったので、タイプミスのために私の謝罪。したがって、XPATH名のエラー。再度、感謝します。 –

0

これは動作する必要があります次のxPath query/test/@ date_timeを試してください。

my $query = '/test/@date_time'; 

また、W3Schoolには、xPathの優れたチュートリアルがあり、libXMLも同様です。

http://www.w3schools.com/xpath/

は、これが役立つことを願っています。

+0

@date_timeを変数として補間しようとしているので警告が表示されます。上記の私の答えを参照してください。 –

+0

私の答えを更新します。 – rpg

関連する問題