Ich möchte mehrere gleich formatierte XML-Dateien in einer CSV-Datei analysieren.So verwenden Sie Nokogiri zum Kombinieren mehrerer gleich formatierter XML-Dateien in eine CSV-Datei
Ich suchte auf Google, nokogiri.org und auf SO, aber ich konnte keine Antwort finden.
Ich habe zehn XML-Dateien im identischen Format in Bezug auf Node/Element-Struktur, die im aktuellen Verzeichnis befinden.
Nach der Kombination der XML-Dateien in eine einzige XML-Datei, muss ich bestimmte Elemente des advisory
-Knotens herausziehen. Ich möchte die link
, title
, location
, os -> language -> name
und reference -> name
Daten in die CSV-Datei ausgeben.
Mein Code ist nur in der Lage ein einzelnes XML-Dokument zu analysieren, und ich würde es in 1 Rechnung tragen mag: viele:
# Parse the XML file into a Nokogiri::XML::Document object
@doc = Nokogiri::XML(File.open("file.xml"))
# Gather the 5 specific XML elements out of the 'advisory' top-level node
data = @doc.search('advisory').map { |adv|
[
adv.at('link').content,
adv.at('title').content,
adv.at('location').content,
adv.at('os > language > name').content,
adv.at('reference > name').content
]
}
# Loop through each array element in the object and write out as CSV row
CSV.open('output_file.csv', 'wb') do |csv|
# Explicitly set headers until you figure out how to get them programatically
csv << ['Link', 'Title', 'Location', 'OS Name', 'Reference Name']
data.each do |row|
csv << row
end
end
Ich habe versucht, den Code zu ändern mehrere XML-Dateien zu unterstützen und erhalten sie in Nokogiri :: XML :: Document-Objekte:
xml_docs = []
Dir.glob("*.xml").each do |file|
xml = Nokogiri::XML(File.new(file))
xml_docs << Nokogiri::XML::Document.new(xml)
end
Dies schafft erfolgreich einen Array xml_docs
mit den richtigen Objekten, die es in, aber ich weiß nicht, wie diese sechs Objekte zu einem einzigen Objekt zu konvertieren.
Dies ist Beispiel XML. Alle XML-Dateien verwenden den gleichen Knoten/Elementstruktur:
<advisories>
<title> Not relevant </title>
<customer> N/A </customer>
<advisory id="12345">
<link> https://www.google.com </link>
<release_date>2016-04-07</release_date>
<title> The Short Description Would Go Here </title>
<location> Location Name Here </location>
<os>
<product>
<id>98765</id>
<name>Product Name</name>
</product>
<language>
<id>123</id>
<name>en</name>
</language>
</os>
<reference>
<id>00029</id>
<name>Full</name>
<area>Not Defined</area>
</reference>
</advisory>
<advisory id="98765">
<link> https://www.msn.com </link>
<release_date>2016-04-08</release_date>
<title> The Short Description Would Go Here </title>
<location> Location Name Here </location>
<os>
<product>
<id>12654</id>
<name>Product Name</name>
</product>
<language>
<id>126</id>
<name>fr</name>
</language>
</os>
<reference>
<id>00052</id>
<name>Partial</name>
<area>Defined</area>
</reference>
</advisory>
</advisories>
Der Code nutzt Nokogiri :: XML :: Dokument aber wenn Nokogiri :: XML :: Builder besser für dies funktioniert, ich bin mehr als bereit zu justieren Mein Code entsprechend.
Willkommen bei Stack Overflow. Während es nett ist, bist du hier umgezogen, leider hast du den Punkt von SO verpasst; Wir helfen * Ihnen * Fehler/Probleme in * Ihrem * Code zu beheben. Bitte lesen Sie "[ask]" einschließlich der Links unten und "[mcve]". Wir würden gerne Beweise für Ihre Bemühungen sehen: Was haben Sie versucht? Warum hat es nicht funktioniert? Wenn du es nicht versucht hast, wo hast du gesucht und warum haben diese Orte nicht die Informationen, die du brauchst? Wenn Sie uns XML geben und uns mitteilen, was Sie tun möchten, riechen Sie, dass wir den Code schreiben sollen, um das Problem zu lösen, anstatt uns zu fragen, wie Sie ein Problem lösen können, dem Sie beim Schreiben begegnet sind. –
Ich werde meine Frage in Kürze mit dem, was ich versucht habe, ändern. Ich wollte die Frage nicht zu lange stellen, aber ich werde sehen, was ich tun kann. Danke für den Hinweis! –
Gern geschehen. SO hat ein ehrgeiziges Ziel, eine Online-Referenz für Programmierprobleme zu sein, eine Art Kochbuch für Probleme und Lösungen. Ihnen geht es gut, wie die Top-Ergebnisse in den Suchmaschinen zeigen, aber es ist eine ständige Aufgabe, dafür zu sorgen, dass die Qualität der Fragen und Antworten hoch bleibt, weshalb wir die Dinge wollen, die wir tun. Lange Fragen bedeuten keine hohe Qualität, so dass sie schwer zu schreiben sind und Voraussicht und Anstrengung erfordern, aber das Endergebnis ist großartig; Sie bekommen eine Antwort und andere auch in Zukunft. Willkommen im Kampf um die Lösung aller Probleme! :-) –