Ruby / rexml: Drehen Sie jedes mit einem Element mit dem gleichen Namen

Was ich machen wollte

Aus der XML-Datei, die von der Meteorological Agency mit Ruby rexml bereitgestellt wurde Ich versuche, die Informationen des Alarms zu erhalten und je nach Situation ein Urteil zu fällen.

Ruby 2.6.3 require 'rexml/document'

Was hat nicht funktioniert

Analysieren Sie die folgenden Dateien und fügen Sie sie in das Dokument ein.

<?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/">
--- Auslassen zwischen ---
  <Head xmlns="http://xml.kishou.go.jp/jmaxml1/informationBasis1/">
--- Auslassen zwischen ---
    <Headline>
      <Text>Achten Sie in der Präfektur Osaka auf Erdrutsche, schwere Stürme wie Tornados und Blitzeinschläge.</Text>
      <Information type="Meteorologische Warnung / Warnung (Präfektur-Vorhersagegebiet usw.)">
        <Item>
          <Kind>
            <Name>Starke Regenwarnung</Name>
            <Code>10</Code>
          </Kind>
          <Kind>
            <Name>Donnerwarnung</Name>
            <Code>14</Code>
          </Kind>
          <Areas codeType="Meteorologische Informationen / Präfekturprognosezone, Unterteilungsgebiet usw.">
            <Area>
              <Name>Präfektur Osaka</Name>
              <Code>270000</Code>
            </Area>
          </Areas>
        </Item>
      </Information>
Weniger als,<Information>gefolgt von

Ich möchte jede Anweisung mit dem Element drehen, also zuerst

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

In diesem Fall wurde jede Anweisung an alle untergeordneten Elemente gesendet, was ein Problem darstellte.

Ich habe zwei Lösungen gefunden, indem ich auf anderen Websites Fragen gestellt habe.

--Verwenden Sie REXML :: XPath.match (beantwortet)

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

--Verwenden Sie get_elements (selbstlösend)

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

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

Nächste Herausforderung

Die Ergebnisse waren für beide gleich, aber was ist der Unterschied? Finden Sie heraus, ob beide gleich sind.

Referenz

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

Recommended Posts

Ruby / rexml: Drehen Sie jedes mit einem Element mit dem gleichen Namen
Ruby, Nokogiri: Ruft den Elementnamen des ausgewählten Knotens ab
Überschreiben Sie den gleichnamigen Upload mit dem BOX SDK (Java).
Programmieren mit Ruby (unterwegs)
Senden Sie E-Mails von Google Mail mit Ruby
Rubys detaillierte Syntax: Wenn es Variablen und Methoden mit demselben Namen gibt
[Ruby] Definieren Sie die Hierarchie gleichzeitig mit der Initialisierung von Hash mit der Tap-Methode