質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

XMLパーサ

XML文書のテキストデータだけを抜き出して、アプリケーションソフトが利用しやすい形式に変換させるソフトウェアをXMLパーサと呼びます。

Q&A

解決済

2回答

1532閲覧

ruby,rexmlを使って要素名を限定してeach文をまわしたい

horumont

総合スコア9

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

XMLパーサ

XML文書のテキストデータだけを抜き出して、アプリケーションソフトが利用しやすい形式に変換させるソフトウェアをXMLパーサと呼びます。

0グッド

0クリップ

投稿2020/08/12 07:29

前提・実現したいこと

XMLファイルをrexmlで処理しています。

同じ階層に違う名前の要素があるときに
特定の要素だけでeach文を回したいです。

対象のXML

<Item> <Kind> <Name>大雨注意報</Name> <Code>10</Code> </Kind> <Kind> <Name>雷注意報</Name> <Code>14</Code> </Kind> <Areas codeType="気象情報/府県予報区・細分区域等"> <Area> <Name>大阪府</Name> <Code>270000</Code> </Area> </Areas> </Item>

この中の<Kind>要素の分だけeachを回したいのですが
<Aress>も同じ階層なので
それも含めてeachがまわってしまいます。

試したこと

itemに上記XMLがelementクラスで入っています。

item.each do |kind| puts kind end => <Kind> <Name>大雨注意報</Name> <Code>10</Code> </Kind> <Kind> <Name>雷注意報</Name> <Code>14</Code> </Kind> <Areas codeType='気象情報/府県予報区・細分区域等'> <Area> <Name>大阪府</Name> <Code>270000</Code> </Area> </Areas>

上記の結果で最後の<Areas>のところはなしにしたいという感じです。

色々と調べたのですが
要素の属性を限定する方法などはあったのですが、
要素を特定する方法がわかりませんでした。

もっと他の方法があれば、そういうこともアドバイスいただきたいです。

よろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gouf

2020/08/12 10:06

現状、ファイルの読み込みなどが書かれていませんが; 実際に動作するサンプルコードを質問欄に書き入れることは可能ですか
horumont

2020/08/12 10:58

アドバイスありがとうございます! 自己解決+回答でなんとかなりました。 確かに質問がまだまだざっくりしてました。 ItemはOsaka.xmlをパースしたdocからelementsメソッドで取り出したものです。 詳しくは自分の自己解決を後ほど投稿しようと思いますので そこを見て、アドバイスあればいただきたいです。
guest

回答2

0

get_elementsで解決できそうです。

もとになっているのがosaka.xmlというファイルです。

xml

1<?xml version="1.0" encoding="UTF-8"?> 2<Report xmlns="http://xml.kishou.go.jp/jmaxml1/" xmlns:jmx="http://xml.kishou.go.jp/jmaxml1/" xmlns:jmx_add="http://xml.kishou.go.jp/jmaxml1/addition1/"> 3 ーーー間省略ーーー 4 <Head xmlns="http://xml.kishou.go.jp/jmaxml1/informationBasis1/"> 5 ーーー間省略ーーー 6 <Headline> 7 <Text>大阪府では、土砂災害や竜巻などの激しい突風、落雷に注意してください。</Text> 8 <Information type="気象警報・注意報(府県予報区等)"> 9 <Item> 10 <Kind> 11 <Name>大雨注意報</Name> 12 <Code>10</Code> 13 </Kind> 14 <Kind> 15 <Name>雷注意報</Name> 16 <Code>14</Code> 17 </Kind> 18 <Areas codeType="気象情報/府県予報区・細分区域等"> 19 <Area> 20 <Name>大阪府</Name> 21 <Code>270000</Code> 22 </Area> 23 </Areas> 24 </Item> 25 </Information>

このあとInformationがつづきます。

ruby

1doc=REXML::Document.new(open(osaka.xml)) 2 3doc.get_elements('//Information/Item/Kind') do |kind| 4puts kind 5end

これで次の結果が得られました

xml

1<Kind> 2 <Name>大雨注意報</Name> 3 <Code>10</Code> 4 </Kind> 5<Name>大雨注意報</Name> 6<Kind> 7 <Name>雷注意報</Name> 8 <Code>14</Code> 9 </Kind>

回答頂いたXPATHの結果と何がちがうのかなあ。
調べてみようと思います!

投稿2020/08/12 11:04

horumont

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

REXML::XPath の出番ですね。

main.rb:

ruby

1# frozen_string_literal: true 2 3require 'rexml/document' 4 5doc = REXML::Document.new(File.read('index.xml')) 6 7kinds = REXML::XPath.match(doc, '/Item/Kind') 8 9kinds.each do |kind| 10 puts kind.to_s 11end

実行しましょう:

$ ruby main.rb <Kind> <Name>大雨注意報</Name> <Code>10</Code> </Kind> <Kind> <Name>雷注意報</Name> <Code>14</Code> </Kind>

XPath については W3C の規格などを参照してください。

投稿2020/08/12 10:40

gemmaro

総合スコア358

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

horumont

2020/08/12 10:55

ありがとうございます! なるほど、Xpathクラスでmatchを使えばとれるのですね。 ついさっき、 元のxmlファイルからkindを指定して get_elementでも 同じような結果が得られました。 きっと細かいところが違うのだろうと思うので もすこし、勉強します。
gemmaro

2020/08/12 11:06

確かに `REXML::Element#get_elements` の方がよりシンプルに書けますね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問