Ruby / rexml: tournez chacun avec un élément du même nom

Ce que je voulais faire

À partir du fichier xml fourni par l'Agence météorologique avec Ruby rexml J'essaie d'obtenir les informations de l'alarme et de porter un jugement en fonction de la situation.

Ruby 2.6.3 require 'rexml/document'

Ce qui n'a pas fonctionné

Analysez les fichiers suivants et placez-les dans le document.

<?xml version="1.0" encoding="UTF-8"?>
<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/">
--- Omettre entre ---
  <Head xmlns="http://xml.kishou.go.jp/jmaxml1/informationBasis1/">
--- Omettre entre ---
    <Headline>
      <Text>Dans la préfecture d'Osaka, faites attention aux glissements de terrain, aux vents violents tels que les tornades et aux coups de foudre.</Text>
      <Information type="Avertissement / alerte météorologique (zone de prévision préfectorale, etc.)">
        <Item>
          <Kind>
            <Name>Avertissement de fortes pluies</Name>
            <Code>10</Code>
          </Kind>
          <Kind>
            <Name>Avertissement de tonnerre</Name>
            <Code>14</Code>
          </Kind>
          <Areas codeType="Informations météorologiques / Zone de prévision préfectorale, zone de subdivision, etc.">
            <Area>
              <Name>Préfecture d'Osaka</Name>
              <Code>270000</Code>
            </Area>
          </Areas>
        </Item>
      </Information>
Moins que,<Information>Suivi par

Je veux tourner chaque instruction avec l'élément , donc d'abord

item = doc.elements['//Item']
item.each do |kind|
puts kind
end

Dans ce cas, chaque instruction était envoyée à tous les éléments enfants, ce qui posait problème.

J'ai trouvé deux solutions en posant des questions sur d'autres sites.

--Utiliser REXML :: XPath.match (répondu)

require 'rexml/document'

doc = REXML::Document.new(File.read('index.xml'))

kinds = REXML::XPath.match(doc, '/Item/Kind')

kinds.each do |kind|
  puts kind.to_s
end

--Utilisez get_elements (auto-résolution)

doc=REXML::Document.new(open(osaka.xml))

doc.get_elements('//Information/Item/Kind') do |kind|
  puts kind
end

Prochain challenge

Les résultats étaient les mêmes pour les deux, mais quelle est la différence? Découvrez si les deux sont identiques.

référence

https://docs.ruby-lang.org/ja/latest/method/REXML=3a=3aElement/i/get_elements.html

Recommended Posts

Ruby / rexml: tournez chacun avec un élément du même nom
Ruby, Nokogiri: récupère le nom de l'élément du nœud sélectionné
Écraser le téléchargement du fichier avec le même nom avec BOX SDK (java)
Programmation avec ruby (en route)
Envoyer des e-mails depuis Gmail avec Ruby
Syntaxe détaillée de Ruby: quand il y a des variables et des méthodes avec le même nom
[Ruby] Définissez la hiérarchie en même temps que l'initialisation de Hash avec la méthode tap