電子書籍の厳選無料作品が豊富!

perl初心者です、いまperlのプログラムを書いていてxmlのデータとのマッチングをしようとしているのですが

<nanka>
<hoge>4</hoge>
</nanka>
<data>1</data>
<hoka>1</hoka>

このような部分があった場合に
</nanka>
<data>1</data>
ここの1のみを取り出したくてマッチングを考えているのですが
/</nanka>.<data>(.*?)<\/data>/s;
ではうまくいかず、困っています。
なにか良い方法、もしくはこのようなマッチングは不可能など
ご意見いただければと思います。

よろしく御願いします。

A 回答 (5件)

整形式の XML文書 (平たく言えば「正しい XML文書」) であるための条件の 1つに「ルート要素が 1個だけある」というものがあります. ところがこの質問文にある形ではルート要素が 3個あります. つまりこれは整形式ではない (分かりやすく言えば「正しくない」) わけです.



ルート要素をでっちあげて
<root>
<nanka>
<hoge>4</hoge>
</nanka>
<data>1</data>
<hoka>1</hoka>
</root>
とすれば整形式の XML文書になる. そうすれば, XPath で「nanka要素の直後の data要素」を指定するだけ.
    • good
    • 0

「モジュールも使ってみたのですが、


二行に渡ってマッチした場合にのみダグの中の値取れなくて断念しました。。」
の意味が分からんのだけど (じゃあ 3行に渡った場合は取れるのか?), てきとうにルート要素をでっち上げて整形式の XML文書にすれば XML::XPath で取れるんじゃないかなぁ.

この回答への補足

すみません、ルート要素をでっちあげるとはどういうことでしょうか...?
XML::XPathででも試してみます、ご指摘ありがとうございます。

補足日時:2013/02/06 17:31
    • good
    • 0

use feature qw(say) ;


$_='<nanka>
<hoge>4</hoge>
</nanka>
<data>1</data>
<hoka>1</hoka>
<chigai>
<hoge>4</hoge>
</chigai>
<data>1</data>
<hoka>1</hoka>
' ;

if( /<\/nanka>.<data>(.*?)<\/data>/s ){
say $1;
}

これでちゃんと 1 と出力されます。

具体的に、どう「うまくいかず、困って」いるのですか?

・質問にある通り、</nanka>の/のエスケープ忘れで、エラーになっている
→/をエスケープする。
あるいは、/を多用するパターンなら、 mを使って、デリミタを/でないものにすると便利です
例: mX<\/nanka>.<data>(.*?)<\/data>Xs
http://perldoc.jp/docs/perl/perlop.pod#Regexp32Q …

・<\/nanka>と<data>の間が「1文字」ではない。(CR+LFで改行されているファイルをそのまま読みこんでいる、改行が無い、末尾に空白がある、等)
→事前に処理しておく(CRLFならCRを削除、末尾の空白ならs/\s+$//gm等)
→ . ではなく、 \s* にしてみる
    • good
    • 0
この回答へのお礼

ありがとうございます。
タグ中の値がとれなくて困っていました。
ご指摘頂いた通り、エスケープを忘れていたりと初歩的な部分がまだ直っていなかったことと
どうもまだ正規表現の理解が足りないことがわかりました。
詳しい開設とサンプル、またサイトを教えていただきありがとうございます。

お礼日時:2013/02/06 23:14

/</nanka>.<data>(.*?)<\/data>/s; で / のエスケープが漏れているのは投稿時のタイプミスでしょうか

?

この回答への補足

いえ、ミスではありませんでした、エスケープをすっかり見落としていました。
ご指摘ありがとうございます。

補足日時:2013/02/06 17:24
    • good
    • 0

XML を処理するならそれなりなモジュールを使った方がいいような気はするけど....



とりあえずどう「困っている」んでしょうか?

この回答への補足

モジュールも使ってみたのですが、
二行に渡ってマッチした場合にのみダグの中の値取れなくて断念しました。。
このxmlは

<nanka>
<hoge>4</hoge>
</nanka>
<data>1</data>
<hoka>1</hoka>
<chigai>
<hoge>4</hoge>
</chigai>
<data>1</data>
<hoka>1</hoka>
というような部分もあって、</nanka>のあとのタグの場合のみ
値を取りたくて…

補足日時:2013/02/06 02:18
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!