• 締切済み

XML要素をテキストファイルに出力するようにするには?

お世話になります。 Perlを使って以下のようなXMLドキュメントを読み込み、テキストファイルの出力を行いたいと思って、正規表現等を使ってプログラムを作ってはいましたが、なかなかうまく行かず、行き詰まってしまいました。 ~~読み出すファイルのタグ~~ <info num = 1> <name>namae1</name> <nunber>10</number> </info> <info num =2> <name>namae2</name> <nunber>25</number> </info> ・ ・ ~~終了~~ 上記で読み出したい要素は、それぞれの<info>タグ内の<name>と、<nunber>のタグ内の要素です。 そして、その要素をテキストファイルに出力する。というようなプログラムを考えております。 事情により、出来れば、Perlのモジュールを使わずに正規表現などにて取り出したいと思っていますが、楽な方法が有ればその方法もおしえていただければと思います。 使用目的は、ローカル上でXMLドキュメント内のデータを抽出することです。 何か良い方法が有れば、ご教授いただけると助かります。 よろしくお願いします。

  • Perl
  • 回答数2
  • ありがとう数1

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

> XML用のライブラリって標準だったかな?) corelist XML XML was not in CORE (or so I think) corelist XML::Simple XML::Simple was not in CORE (or so I think) corelist XML::Parse XML::Parse was not in CORE (or so I think) コアモジュール(標準添付)ではないですね。 #5.8.8の場合 うまくいかないってのはたぶん改行を含んでいるのに sオプションつけてないとか、 最長一致で次の要素まで飲み込んでるとか そんな理由だと思いますが 自前で正規表現でゴリゴリやるなってのには賛成です。

回答No.1

>Perlのモジュールを使わずに正規表現などにて 個人的には「止めとけ、せめてXML DOMを経由しろ」と思っている。 ので >事情により、 聞かせて。(管理者が自分でなくモジュールを追加できないとか・・・。XML用のライブラリって標準だったかな?) ==================== やめとけっていった理由だけど <root> <info num ="1"> <name>namae1</name> <number>10</number> </info> <info num="2"> <name>namae2</name> <number>25</number> </info> <info num="3"> <name><!-- </name><name> --></name> <number>25</number> </info> <info num="4"> <name><![CDATA[ </name><name> ]]></name> <number>25</number> </info> <info num="5"> <name>&lt;</name> <number>25</number> </info> <info num="6"> <name>&#x2407;</name> <number>25</number> </info> <info num="7"> <name>*</name> <number>25</number> </info> <info num="8"> <name><![CDATA[</name><!-- <name> --> ]]></name> <number>25</number> </info> <info num="8"> <name><![CDATA[</name><!-- <name> * ]]></name> <number>25</number> </info> <info num="9"> <name>>-- > </name> <number>25</number> </info> <info num ='10"'> <name>namae1</name> <number>10</number> </info> <info num ="11'"> <name>namae1</name> <number>10</number> </info> </root> <!-- どこのパーザ経由したかわかんない状態だと XMLファイルがどういう風になっているかわからないし・・・ (サンプルはかなりというか物凄く意地悪に作ってますが) どうでもいいけど CDATAマーク区間ならまだしも,#PCDATA中にも]]>って出現できないんだね。初めて知った。 上のように要素中に文字参照があった場合 ソースのまま取り出すべきか,展開かますべきか・・・とか 考えなきゃいけないことがたくさん -->

rootmind
質問者

お礼

回答ありがとうございます。 >上のように要素中に文字参照があった場合 >ソースのまま取り出すべきか,展開かますべきか・・・とか >考えなきゃいけないことがたくさん 確かに今考えてみるとそうですね。取り出したい要素の内容が複雑になればなるほど、モジュールを使うメリットが大きいように思います。 モジュールを使って組み直したいと思います。(XML DOMを使って組む方法がよくわかりませんが。。。)

rootmind
質問者

補足

回答ありがとうございます。 事情というのは・・・ >(管理者が自分でなくモジュールを追加できないとか・・・。) ご指摘の通り、似たような事情ですが、管理者が自分でないことでモジュール追加変更などの設定変更が自由に出来ないことと、作ったPerl自体をローカルで実行したいと考えているからです。 (支援ツールとして使ってもらうことを考えると、使う人の数が増えるほど、設定を行ってもらう人の数が増えるため、作った意味がないなぁと感じています。) また、ローカルで実行することでXMLドキュメントのタグが変わったり、つかうひとによって、抽出したいタグの要素が違ったりしたときに対応できると思ったからです。(済みません。考えが甘くて・・・。) 長文失礼しました。

関連するQ&A

  • xmlファイルが生成されない

    <?php //DomDocumentを呼び出す $dom = new DomDocument('1.0','UTF-8'); //要素ノード[document]を追加 $document = $dom->appendChild($dom->createElement('document')); //新しい要素をdocumentの子要素として挿入する $document->appendChild($dom->createElement('name','名前です')); $document->appendChild($dom->createElement('text','テキストです。')); //字下げや空白を考慮してきれいに整形した出力を行う $dom->formatOutput = true; //同階層にtest.xmlとして保存 $dom->save('test.xml'); //出力 echo $dom->saveXML(); ?> のように、同じディレクトリ内にXMLファイルを生成するphpプログラムを作成してみたのですが、 ブラウザからこのPHPファイルにアクセスしてもXMLファイルが作られません。どうすれば良いのでしょうか。 なにかphp,apache等の設定をしてないからでしょうか。 よろしくお願いします。

    • 締切済み
    • PHP
  • PerlによるXMLファイルの解析&出力

    XMLファイルで以下のようなXMLファイルから、 <?xml version="1.0" encoding="Shift_JIS"?> <class3> <Personal> <No>1</No> <Name>相上男</Name> <phone>00-0000</phone> </Personal> <Personal> <No>2</No> <Name>柿句毛子</Name> <phone>11-1111</phone> </Personal> </class3> perlでNameの部分のタグだけ抜き出しXMLファイルに出力するプログラムを組み立てたいです。自分でも以下のようなプログラムを組み立てたのですが、 #!/usr/bin/perl use strict; use Encode; use XML::XPath; use XML::XPath::XMLParser; # 書き込み用にファイルを開く open( OUTPUTFILE, ">Output2.xml" ); # 標準出力に書き出し print &xml_xpath; # ファイルを出力先に設定 select( OUTPUTFILE ); # 出力先を元に戻す select( STDOUT ); # ファイルを閉じる close( OUTPUTFILE ); sub xml_xpath{ my $file = "class3.xml"; my $xp = XML::XPath->new(filename => $file); foreach my $node( $xp->find('/class3/Personal/Name')->get_nodelist){ print Encode::encode("shift_jis", $node )."\n"; } } XML::XPath::Node::Element=REF(0x1036c58c) XML::XPath::Node::Element=REF(0x1036cb8c) と、出てくるだけで動きません。ほとんど初心者なのでまったく見当違いのプログラムを組み立てているかもしれませんが、よろしくおねがいします。

  • 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
  • xmlを読み込んで、データをリストに・・・

    Javaでxmlファイルを読み込んで、リストに入れたいのです。xmlファイルには <info id="hogehoge" name="sample" </info> <info id="hogehogehoge" name="samplesample" </info> といったようにrootがないxmlファイルになっており、idをリストに入れたいのです。rootタグがないと難しいでしょうか? どなたかご教授願います!

    • ベストアンサー
    • Java
  • perlでxmlファイルを検索して表示する方法

    perlであるxmlファイルを検索して xmlファイルを表示する方法についてお伺いします c:\ -A --X 1.xml 2.jpg 3.jpg --Y --Z このような構造でxからzまでのディレクトリをさがして 「.xml」のファイルの中にある文字列「uuuuu」があれば そのファイルのリストを出力して、クリックすると表示 させたいのですが、perlでできますでしょうか このときファイルのリストを出力するときに 実際のファイル名を.xmlにある特定のタグについて囲まれた 文字列を表示したいと思っています。 (<name>abcde</name>) また「uuuuu」は任意で入力を要求するようにしたいと 思っています。 私ができることはテキストファイルの中身を表示するくらいです open (FILE, 'c:\A\X\1.xml') or die "$!"; while (my $line = <FILE>){ chomp $line; print "$line\n"; } close (FILE); ほかにこのような参考書、urlなどありましたら教えて いただけると幸いです よろしくお願いします

  • XML 特定の文字を出力するとエラー

    PHP(5)から、XMLへ特定の文字を出力するとエラーになります。 XML出力例 <?xml version="1.0" encoding="UTF-8"?> <xDoc> <Record> <NO>1</NO> <Name><![CDATA[門]]></Name> </Record> </xDoc> ドキュメントファイル上には出力できていますが、 ブラウザ上で確認するとエラーが出ます。 文字コードの問題でしょうか?

    • 締切済み
    • PHP
  • vb6 XMLファイル出力について<S></S>

    vb6にてXMLファイル出力のプログラムを作成しています。 XMLファイル内容 <?xml version="1.0" encoding="UTF-8"?> <root> <key>AA</key> <string>aa</string> <key>BB</key> <string/> </root> 上記の<string/>の部分を<string></string>のように出力したいのですが、 どうしても上手くいきません。 下記にソースを記載します。 何か少しでもお分かりになる情報がありましたらご教授願いします。 よろしくお願いします。 Dim xmlDoc As MSXML2.DOMDocument 'XMLドキュメント Dim xmlPI As IXMLDOMProcessingInstruction 'XML宣言 Dim node(50) As IXMLDOMNode '要素 Dim attr As MSXML2.IXMLDOMAttribute '属性 'XMLドキュメントを作成 Set xmlDoc = New MSXML2.DOMDocument 'XML宣言を追加 Set xmlPI = xmlDoc.appendChild(xmlDoc.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8""")) '<root>要素を追加 Set node(1) = xmlDoc.appendChild(xmlDoc.createNode(NODE_ELEMENT, "root", "")) '<key>要素を追加 Set node(2) = node(1).appendChild(xmlDoc.createNode(NODE_ELEMENT, "key", "")) node(2).Text = "AA" '<string>要素を追加 Set node(3) = node(1).appendChild(xmlDoc.createNode(NODE_ELEMENT, "string", "")) node(3).Text = "aa" '<key>要素を追加 Set node(4) = node(1).appendChild(xmlDoc.createNode(NODE_ELEMENT, "key", "")) node(4).Text = "BB" '<string>要素を追加 Set node(5) = node(1).appendChild(xmlDoc.createNode(NODE_ELEMENT, "string", "")) node(5).Text = "" 'XMLドキュメントの出力 Dim strXMLFile As String strXMLFile = Format(Date, "yyyymmdd") & Format(Time, "hhmmss") xmlDoc.save ("C:TEST\TEST.xml") '終了処理 If Not xmlDoc Is Nothing Then Set xmlDoc = Nothing If Not xmlPI Is Nothing Then Set xmlPI = Nothing

  • XML(DTD)の<!ENTITYを読み込むには?

    Perlで、XMLのDTD内の、 たとえば以下のような   ↓ <!ENTITY rt4 "ルーチン4"> (キー”rt4”と、値”ルーチン4”)を、 読み込むには、どうすればよいのでしょうか? 単純にXML(DTD)をテキストファイルとしてオープンして、 正規表現などで読み込むのではなく、 この<!ENTITY~ タグを利用して、 簡単に読み込める方法があるのでは? と思い、ネット上を探しておりましたが、 具体的な方法が見つけられなかった為、 ご質問させていただきました。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • PerlでXMLを解析して出力する。

    PerlでXMLで必要なデータだけ抽出しようと考えています。 下のサンプルXMLを次のテキストに変換したいのですが 具体的な記述方法が知りたく質問しました。 さくら  子供1  子供2 きく  子供3 正規表現でなくXMLパーサ?というもので解決したいです。「宿題ではありません、あしからず(^^;」 <?xml version="1.0"> <E1> <E2> <list>example1></list> <list>example2></list> ... </E2> <E3> <class name="さくら"> <heya> <hito> <seimei>子供1</seimei> </hito> <hito> <seimei>子供2</seimei> </hito> </heya> </class> <class name="きく"> <heya> <hito> <seimei>子供3</seimei> </hito> </heya> </class> </E3> </E2> </E1>

    • ベストアンサー
    • Perl
  • XMLからデータを取得

    いつもお世話になっております。 XMLファイルに含まれたデータの中から、特定のデータを検索するプログラムを作りたいと思っております。 <AAA Name="テスト">    <BBB x="2" y="2"></BBB>    <CCC Num="0001"></CCC>    <CCC Num="0002"></CCC> </AAA> XMLデータの形式は↑みたいな感じで、これが100以上あり、CCCタグは0~5個までです。 フォームにテキストボックスを配置し、そこに検索したい語句を入れ、 AAAタグのNameの中身と合致したら、BBB、CCCの属性をすべて取得して表示するということをしたいのですが、 どうにも上手くいきません。 VB2008を使用しております。 方法をご存知の方、ご教授ください……orz

専門家に質問してみよう