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件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
整形式の XML文書 (平たく言えば「正しい XML文書」) であるための条件の 1つに「ルート要素が 1個だけある」というものがあります. ところがこの質問文にある形ではルート要素が 3個あります. つまりこれは整形式ではない (分かりやすく言えば「正しくない」) わけです.
ルート要素をでっちあげて
<root>
<nanka>
<hoge>4</hoge>
</nanka>
<data>1</data>
<hoka>1</hoka>
</root>
とすれば整形式の XML文書になる. そうすれば, XPath で「nanka要素の直後の data要素」を指定するだけ.
No.3
- 回答日時:
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* にしてみる
ありがとうございます。
タグ中の値がとれなくて困っていました。
ご指摘頂いた通り、エスケープを忘れていたりと初歩的な部分がまだ直っていなかったことと
どうもまだ正規表現の理解が足りないことがわかりました。
詳しい開設とサンプル、またサイトを教えていただきありがとうございます。
No.1
- 回答日時:
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>のあとのタグの場合のみ
値を取りたくて…
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 格納したデータを配列のように扱う方法はありますか? 8 2023/06/05 08:53
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- その他(Microsoft Office) Excel 2列分のDATAの並べ替え 1 2023/01/01 17:12
- Excel(エクセル) 何方か知恵をください… 下記のシート1にシート2のDATAを表示させたいです。 (シート1の2行目の 6 2022/03/28 17:27
- C言語・C++・C# プログラミングの問題です。写真のプログラムの1から10を下のように入力しましたがプログラムが上手くい 3 2022/07/01 23:31
- その他(プログラミング・Web制作) Python - Excel で Webからデータを連続取得したいのですが エラーが出ます 1 2023/07/06 20:08
- 英語 From the data mentioned that extracted from the cu 1 2023/01/25 19:55
- Java 動かなくなったのでJavaソースを手直しお願いします。 2 2022/04/30 05:35
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストファイルで提出とは?
-
ファイルをディレクトリ分配の...
-
openした後、closeしないでプロ...
-
perlのプログラミング 部分入れ...
-
Perlのエラーについてご教授く...
-
画像が表示でnull; this.src
-
perlプログラミング 空白行削除
-
Perlで特定文字列から特定文字...
-
ラズベリーパイ初心者です。 ラ...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
openした後、closeしないでプロ...
-
テキストファイルで提出とは?
-
INDIRECT 横に再度抽出したい
-
Perlで特定文字列から特定文字...
-
perlをバージョンアップしたら...
-
Wallpaper Engineでおすすめの...
-
arduino の割り込み処理について
-
アルファベットに付いて質問し...
-
Strawberry Perl for Windows ...
-
Perlで時間の計算
-
このファイルを開く方法で困っ...
-
TeraPadエディターの操作方法に...
-
cgiでサーバーにファイルを追加...
-
フローチャート 九九
-
LinuxにおいてのPerlのプログラ...
-
perl 初等プログラミングについて
-
Perlのエラーについてご教授く...
-
こんにちは ブラケッツでプログ...
-
bashスクリプト
-
perlプログラミング 空白行削除
おすすめ情報