PerlでXMLの値を取得する方法

このQ&Aのポイント
  • Perlを使ってXMLの処理をする際に、指定のキーと値を取得する方法を紹介します。
  • 上記のXMLの例では、Person->Name{'A'}->Seiseki->Englishで50という値を取得する方法があります。
  • 直感的な方法として、PerlのXML::XPathモジュールを使うことで、指定のパスをたどって値を取得することができます。
回答を見る
  • ベストアンサー

XMLのキーと値を取得するには?

PerlでXMLの処理をしたいのですが、以下のようなXMLをどのようにしたら値が取れるのでしょうか? できれば、Person->Name{'A'}->Seiseki->Englishで50が取得できるような 直感的な方法がうれしいです。 <Person> <Name>A</Name> <Age>29</Age> <Sex>M</Sex> <Seiseki> <English>50</English> <Math>60</Math> <Gymnastic>10</Gymnastic> </Seiseki> <Name>B</Name> <Age>32</Age> <Sex>F</Sex> <Seiseki> <English>60</English> <Math>40</Math> <Gymnastic>50</Gymnastic> </Seiseki> </Person>

  • bazax
  • お礼率5% (12/228)
  • Perl
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

http://weeeblog.net/logs/2008/04/04_1632.php XML::Simpleを使えばできます。 ・・・がデータ構造的にbazaxさんの言うようにはできません(あとPerlの文法的にも難しいと思います) bazaxさんの提示したXMLをprint Dumperしてみると次のようになりました。 ---------------------------------- $VAR1 = { 'Age' => [ '29', '32' ], 'Seiseki' => [ { 'Math' => '60', 'English' => '50', 'Gymnastic' => '10' }, { 'Math' => '40', 'English' => '60', 'Gymnastic' => '50' } ], 'Sex' => [ 'M', 'F' ], 'Name' => [ 'A', 'B' ] }; ---------------------------------- このようにAとBの結果が混ざってしまいます。 データ構造を ---------------------------------- <Person> <A> <Age>29</Age> <Sex>M</Sex> <Seiseki> <English>50</English> <Math>60</Math> <Gymnastic>10</Gymnastic> </Seiseki> </A> <B> <Age>32</Age> <Sex>F</Sex> <Seiseki> <English>60</English> <Math>40</Math> <Gymnastic>50</Gymnastic> </Seiseki> </B> </Person> ---------------------------------- のように変えれば ---------------------------------- $VAR1 = { 'A' => { 'Age' => '29', 'Seiseki' => { 'Math' => '60', 'English' => '50', 'Gymnastic' => '10' }, 'Sex' => 'M' }, 'B' => { 'Age' => '32', 'Seiseki' => { 'Math' => '40', 'English' => '60', 'Gymnastic' => '50' }, 'Sex' => 'F' } }; ---------------------------------- となり、 ---------------------------------- my $xml = XMLin($filename); print $xml->{A}->{Seiseki}->{English} # => 50 ---------------------------------- のように値にアクセスできます。

関連するQ&A

  • jQueryでXMLを書き換えた後に全体を取得する

    初めて質問させていただきます。 JavaScript(jQuery)でXMLを扱っているのですが、 var d = $.parseXML(xml); var n = $(doc.getElementById('person')); $(n).attr('age', 18); のようにDOMでXMLの中身を書き換えた後、"html()"のようにXML全体を簡単に取得する方法はあるのでしょうか? どなたかご存知の方がいらっしゃいましたら、教えていただければ幸いです。 よろしくお願いいたします。

  • VBSでxmlの値を書き換えたい

    お世話になります。 VBScriptで作成しています。 A.xmlの「sx」の値を全て200にしたいと思っております。 A.xmlの値を抜き取って、OKフォルダに複製する処理は 作ったのですが、どのようにして、sxを指定・その中の値を 変更するのかわかりません。 お手数ですが、ご教授お願いいたします。 ------------------A.xml---------------------------- <?xml version="1.0" encoding="UTF-8"?> <links> <link id="0" name="" title=""> <sx>145</sx> <sy>142</sy> </link> <link id="1" name="" title=""> <sx>495</sx> <sy>142</sy> </link> <link id="2" name="" title=""> <sx>155</sx> <sy>510</sy> </link> </links> --------------------------------------------------- ------スクリプト------------------------------------------------ Set Fso = CreateObject("Scripting.FileSystemObject") Set objXML = CreateObject("Msxml2.DOMDocument.3.0") ' カレントディレクトリ str = WScript.ScriptFullName Set obj = Fso.GetFile( str ) Set obj = obj.ParentFolder str = obj.Path ' XML を読み込み objXML.load( str & "\A.xml" ) ********************************************************** '''ここで、sxの属性の値を変更したい ********************************************************** ' XML を保存 objXML.save( str & "\OK\A.xml" ) ------------------------------------------------------

  • 構造体型のポインタ変数を含む構造体

    struct seiseki_tag { Int32 math ; Int32 english ; Int32 science; } ; typedef struct seiseki_tag SEISEKI ; struct personal_tag { Char name ; Int32 num ; SEISEKI *sptr } : typedef struct personal_tag PERSONAL ; struct info_tag { PERSONAL person_info ; } ; typedef struct info_tag INFO ; たとえば、上記のように3つの構造体があり、PERSONAL構造体のメンバーに SEISEKI構造体の型を持つポインタ変数が含まれているような場合で、下記のように INFO型のポインタ変数からSEISEKI構造体のメンバーを参照する方法を教えてください。 PERSONAL構造体メンバーのnameやnumは INFO *info ; info->person_info.name ; info->person_info.num ; のように参照すると思いますが、sptrが示すSEISEKI構造体のメンバーへの アクセスができません。下記のように参照を試みたのですがコンパイルは 通るのですが、実際に参照できていませんでした。 INFO *info ; SEISEKI *seiseki ; seiseki = info->person_info.sptr ; seiseki->math ; 判りにくい説明で申し訳ありませんが、どなたか教えていただければと思います。 よろしくお願いいたします。

  • perl の複雑(?)なクラス定義(データ構造)

    以下のようなクラスを作成したいのですが、どのようにクラスとして定義して、どのように呼び出せばよいのでしょうか。特に「score」の部分の記述方法が良く分かりません。 オブジェクト指向(とくにPerl)はあまり経験がない初心者です。 -------------------- データ構造 name addr score--+-- math +-- english +-- science -------------------- クラス記述 package myClass; $ref_score->{math} = '30'; # <-- 正しい? $ref_score->{english} = '40'; # <-- 正しい? # ... sub new { my $class = shift; my $self={}; $self->{name} = 'tanaka'; $self->{addr} = 'tokyo'; $self->{score} = $ref_score; # <-- 正しい? bless $self, $class; } -------------------- メイン文 package main; $inst[0] = myClass::new(); $inst[0]->{name} = "OVERWRITE_NAME"; $inst[0]->{score}->{math} = "OVERWRITE_SCORE_MATH"; print $inst[0]->{module}."\n"; # 出る print $inst[0]->{score}->{math}."\n"; # オーバーライトした値は出るが... print $inst[0]->{score}->{english}."\n"; # 初期値のままの値は表示してくれない... 宜しくお願いいたします。

  • xmlデータの編集について

    xmlデータの編集について ******************************************* <?xml version="1.0" encoding="UTF-8" ?> <data> <member_list> <name>メンバー1</name> <age>10歳</age> <email>aaa@a.ne.jp</email> </member_list> <member_list> <name>メンバー2</name> <age>20歳</age> <email>bbb@a.ne.jp</email> </member_list> </data> ***************************************** 上記のような"member.xml"があり、これらをフォームから入力された内容に書き換えたい場合は、どういった処理を行えばいいのでしょうか? if(isset($_POST['add'])){ $xml=simplexml_load_file("member.xml"); $addElm = $xml -> addChild("member_list"); $addElm ->addchild("name",$_POST['names']); $addElm ->addchild("age",$_POST['age']); $addElm ->addchild("email",$_POST['email']); $xml ->asXml("member.xml"); } 追加でしたら上記のような"simplexml"の"addchild"でいけるのですが、書き換える場合の処理がわかりません。 どなたか、ご教授下さいませ。

    • 締切済み
    • PHP
  • XSLTでtest.xmlファイルのccc要素の値を取得する場合は以下

    XSLTでtest.xmlファイルのccc要素の値を取得する場合は以下(1)、(2)のようにやればいいのですが、(2)の箇所のパス(testを)動的(可変)にすることはできるのでしょうか? (1)document関数によりxmlファイルを変数に格納  <xsl:variable name="aaa" select="document('test.xml')"/> (2)上記変数からパスを指定して値を取得  <xsl:variable name="bbb" select="$aaa/test/ccc"/> test.xml <test> <ccc>bbb</ccc> </test> 例)以下は間違ってると思いますがパスに変数を使用して値を取得することは可能でしょうか?   <xsl:variable name="ccc" select="'test'"/> // 変数cccにtestという文字列を格納   <xsl:variable name="bbb" select="$aaa/$ccc/ccc"/> //test/cccがパスのつもり

    • 締切済み
    • XML
  • 関数で算出した値を他の関数で使いたい。

    こんにちは。「平均点を出す関数」と「数学の点数のベスト3を出す関数」を使って、「1.平均点」と「2.数学の点数のベスト3の名前とその点数と、各々の点数と平均点との差」を求めるプログラムを作っています。平均点とベスト3の名前とその点数は出せるのですが、「平均点を出す関数」で求めた値をもって来れず、「平均点との差」がうまく表示できません。ソースは下記のようになっております。簡単な修正で直せる方法を教えていただきたいのですが。宜しくお願い致します。 #define STUDENT 4 #include <stdio.h> struct SEISEKI_T {  char name[20]; /* 生徒名を格納する配列。40バイト格納化。 */ int math; /* 数学の点数 */}; typedef struct SEISEKI_T SEISEKI; int average(SEISEKI *sp, int num, int *p); int rank_math(SEISEKI *sp, int num, int *p); int main( ) { SEISEKI seito[STUDENT] = { /* 生徒名と数学の点数のデータ */ { "佐藤", 63},{ "鈴木", 68},{ "高橋", 61},{ "田中", 40}, }; SEISEKI *sp; sp = seito; static int avg[0] = {0}; average(seito, SUBJECT, avg); rank_math(seito, SUBJECT, avg); printf("\n"); return 0; } int average(SEISEKI *sp, int num, int *p) { int i; /* ループ変数 */ static int avg[0] ={0}; for (i = 0; i < 4 ; i++) { avg[0] += (sp + i)->math; } avg[0] = avg[0] / 4 ; printf( "数学 = %3d \n", avg[0]); printf("\n\n"); } int rank_math(SEISEKI *sp, int num, int *p) { int i; /* ループ変数1 */ int j; /* ループ変数2 */ int sa_m = 0; /* 数学の上位成績者の点数と平均点との差。*/ SEISEKI dumy; /* struct SEISEKI_T 型の構造体 dumy */ for ( i = 0 ; i < STUDENT - 1 ; i++ ) { for ( j = 0 ; j < STUDENT - i - 1 ; j++ ) { if( ((sp + j)->math) < ((sp + j + 1)->math) ) { dumy = *(sp + j); *(sp + j) = *(sp + j + 1); *(sp + j + 1) = dumy; } } } printf( "■数学上位成績者\n" ); printf( "----------------------------------\n" ); printf( "順位 名前 点数 平均+\n" ); printf( "----------------------------------\n" ); for ( j = 0 ; j < 3 ; j++ ) { sa_m = (sp + j)->math - *p; printf( " %d %6s %3d %2d\n" , j + 1 , (sp + j)->name , (sp + j)->math , sa_m); } return 0; }

  • 【アプリ開発】日本語を含むXMLファイル読み込み

    iOSアプリ開発しています。(iOS5 SDK/Xcode4.3/Objective-C) XMLファイル(日本語を含む)を読み込みそれを表示さたいのですが文字化けしてしまい困っています。 今、私が試しているのは「iPhone/iPadアプリ開発逆引き大全500の極意」という書籍のサンプルの中の「XMLファイルを読み込む」というサンプルです。サンプルだとXMLファイルで読み込む文字列はアルファベットなのでちゃんとうごいて文字化けせずに表示もされます。ですが、xmlファイルの読み込みたい文字列を日本語にすると「ÅÏ∞‰æ」のような感じで文字化けしてしまいます。 このサンプルのxmlファイル読み込みにはxmlParseFile関数、libxml2を使用していて、XMLファイル(persons.xml)を読み込んでUITextViewに表示するプログラムです。 サンプルのxmlファイル内にある文字列「masuda tomoaki」「yamada taro」「tanaka ziro」をそれぞれ「松田」「山田」「田中」と書き換えて保存してアプリを実行すると文字化けします。 他にどこか書き換えないといけないのでしょうか? ↓サンプルコードを付けています。 どうしたら日本語も読み込めるようになるか、どなたかアドバイスをお願いします。ネットで何日もかけて調べても解決できなかったのでどうか助けてください。 何卒よろしくお願いします。 ↓「iPhone/iPadアプリ開発逆引き大全500の極意」のサンプルダウンロードページ(この中のBasic195) http://www.shuwasystem.co.jp/support/7980html/3352.html 以下、サンプルのコード「ViewController.h」「ViewController.m」「persons.xml」です。 【ViewController.h】 #import <UIKit/UIKit.h> #include <libxml/parser.h> #include <libxml/xpath.h> @interface ViewController : UIViewController { IBOutlet UITextView *textView; } - (IBAction)clickRead:(id)sender; @end 【ViewController.m】 #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); } - (IBAction)clickRead:(id)sender { NSString *path = [[NSBundle mainBundle] pathForResource:@"persons" ofType:@"xml"]; xmlDocPtr doc = xmlParseFile([path cStringUsingEncoding:NSUTF8StringEncoding]); // XMLファイルを読み込む xmlXPathContextPtr context = xmlXPathNewContext(doc); xmlChar *xpath = (xmlChar*)[@"//person/name" cStringUsingEncoding:NSUTF8StringEncoding]; xmlXPathObjectPtr result = xmlXPathEval(xpath , context); xmlNodeSetPtr nodeset = result->nodesetval; NSMutableString *text = [NSMutableString string]; for ( int i=0; i<nodeset->nodeNr; i++ ) { xmlChar *element = xmlNodeListGetString(doc, nodeset->nodeTab[i]->children, 1); NSLog(@"element: %s", element); [text appendFormat:@"name: %s\n", element]; } xmlXPathFreeObject(result); xmlXPathFreeContext(context); textView.text = text; } @end 【persons.xml】 <?xml version="1.0" encoding="utf-8" ?> <persons> <person id="01"> <name>masuda tomoaki</name> <age>43</age> <address>tokyo</address> </person> <person id="02"> <name>yamada taro</name> <age>30</age> <address>oosaka</address> </person> <person id="03"> <name>tanaka ziro</name> <age>20</age> <address>hokkaido</address> </person> </persons>

  • XMLファイル内のデータ(値)を変更するには?

    XMLファイルに書かれているデータを変更するプログラムを書きたいのですが、何か良い方法はありますか? 言語は問いません、初歩的な質問かもしれませんがお願いします。 以下valueの部分(数値)を、 value='12'からvalue='13' のように変更したいのですが、便利な関数などあるでしょうか? <set name='その1' value='12' /> <set name='その2' value='3' /> <set name='その3' value='5' /> <set name='その4' value='10' /> XMLファイルをオープンして読み込んでから、正規表現などでvalueの値を取得、変更し、ファイルを上書きするのではスマートで無い気がしまして。

    • 締切済み
    • XML
  • jQueryでxmlの異なるタグ要素を取得したい。

    jQueryを最近勉強したての者です。 詳しい方、どうか教えて下さい。 HTMLにxmlのデータを読み込ませようとしています。 概略をお話しすると、 htmlファイルによって、xmlの別々の要素を取得したいのです。 やりたいメソッドは同じです。 別々の要素の中のデータによって、imgの表示/非表示を切り替えたいのです。 問題は、対象となるhtmlファイルが複数あり そのhtmlファイルによって、参照するxmlのタグが異なる事なんです。 xmlは、以下のように<shopdata>をルートノードとし、以下のような感じです。 --------------------- <?xml version="1.0" encoding="utf-8"?> <shopdata> <item> <name1>0</name1> <name2>1</name2> <name3>0</name3> </item> </shopdata> --------------------- <name*>~</name*> の中のデータは、0もしくは1なのですが 0の時はimgを表示 1の時はimgを非表示させようと考えています。 ただ<name1><name2><name3> とタグ名がバラバラなんです。 ※おしりの数字が違うだけで、規則的ではあります。 ちなみにhtmlは複数あって  a.htmlの時は→xmlの<name1>を参照  b.htmlの時は→xmlの<name2>を参照  c.htmlの時は→xmlの<name3>を参照 という感じです。 ※htmlファイル名は特に規則的ではなく、いろいろなファイル名がついています。。。 最初、考えたのは、 htmlのどこかに、id="1"と入れて、idが1の時は、<name1>の要素を取得し、 htmlのどこかに、id="2"と入れて、idが2の時は、<name2>の要素を取得し… っていうことを考えたのですが、それもどのように書いたら良いのかが分からないんです。 そもそも、そういった事は可能なのでしょうか? ちなみのhtmlのbodyタグ自体がテンプレートでできているので、 idをどこかにふるとしたら、head内とかになるのしょうか? それぞれ、ボタンの表示は、 if文を使って、show(),hide()メソッドを使うとは思うのですが… 詳しくコードを教えていただけたら、助かります。 どうか、宜しくお願いいたします。

    • ベストアンサー
    • AJAX

専門家に質問してみよう