Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Probleme mit XML
BeitragVerfasst: 07 Jun 2012, 22:00 
Offline
Hacker
Benutzeravatar

Registriert: 08 Mai 2007, 20:03
Beiträge: 465
Wohnort: Köln
Hallo,
ich muss eine XML-Datei verarbeiten, was mit xmlsimple auch ganz gut funktioniert. Leider ist die XML-Datei nicht so ganz regelkonform (zumindest nach meinen Begriffen). So tauchen an einigen Stellen solche Konstrukte auf: </p></p>, die ganz und gar nicht vorgesehen sind. Um es konkreter zu machen ein (gekürztes) Beispiel:

Musik und Gesellschaft

Arbeitsblätter für soziale Musikpflege und Musikpolitik
1930
Reprint:

Musik und Gesellschaft. [Berlin]

was mit xmlsimple zu diesem Datensatz führt:
{"Titel"=>["Musik und Gesellschaft"],
"Nebentitel"=>[{}],
"Untertitel"=>["Arbeitsblätter für soziale Musikpflege und Musikpolitik"],
"Jahr"=>["1930"],
"Bemerkungen"=>[{"p"=>[{}, {}], "content"=>["Reprint:", "Musik und Gesellschaft. [Berlin]}
Den Teil <p/><p/> bzw. das daraus resultierende [{"p"=>[{}, {}], "content"=> hätte ich gern weg, finde aber keinen passenden Weg dafür.
Die XML-Datei wird erzeugt, daran kann ich nichts drehen. Möglich wäre in einem "Vorlauf" mittels regulärer Ausdrücke aus
Reprint:

Musik und Gesellschaft. [Berlin]Reprint: Musik und Gesellschaft. [Berlin] zu machen, aber das scheint mir irgendwie die Brechstangen-Methode zu sein. Gibt es nicht eine elegantere Möglichkeit, z.B. xmlsimple zu veranlassen, diese mehrfach auftretenden <p/> einfach zu überlesen?

Bin für jeden Hinweis dankbar
klausb



Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Probleme mit XML
BeitragVerfasst: 07 Jun 2012, 22:28 
Offline
Interpreter
Benutzeravatar

Registriert: 18 Sep 2008, 22:32
Beiträge: 1411
Wohnort: NRW → UN
klausb hat geschrieben:
Leider ist die XML-Datei nicht so ganz regelkonform (zumindest nach meinen Begriffen).
Nicht nur nach deinen. Das ist kaputtes XML und ein strikter XML-Parser würde eine Verarbeitung verweigern.

klausb hat geschrieben:
Die XML-Datei wird erzeugt, daran kann ich nichts drehen.
Auch keinen Bug melden? Denn das das einer ist, steht außer Frage.

klausb hat geschrieben:
Gibt es nicht eine elegantere Möglichkeit, z.B. xmlsimple zu veranlassen, diese mehrfach auftretenden <p/> einfach zu überlesen?
Ich weiß ja nicht, aus welchen Gründen du xmlsimple verwendest (und ich kenne mich damit nicht aus), aber mit Nokogiri kannst du kaputtes XML wieder richten, solange es nicht totaler Ramsch ist: irb(main):001:0> require "nokogiri"
=> true
irb(main):002:0> str =<irb(main):003:0"
irb(main):004:0" Musik und Gesellschaft
irb(main):005:0"
irb(main):006:0" Arbeitsblätter für soziale Musikpflege und Musikpolitik
irb(main):007:0" 1930
irb(main):008:0" Reprint:

Musik und Gesellschaft. [Berlin]
irb(main):009:0"
irb(main):010:0" EOF
# [...]
irb(main):011:0> xml = Nokogiri::XML(str)
# [...]
irb(main):012:0> puts xml.canonicalize

Musik und Gesellschaft

Arbeitsblätter für soziale Musikpflege und Musikpolitik
1930
Reprint:

Musik und Gesellschaft. [Berlin]


=> nil
irb(main):013:0> Ist aber glaube ich nicht ganz das, was du suchst. Außer der "Brechstangen-Methode" fällt mir sonst aber auch nichts ein.

Vale,
Quintus

_________________
Habe den Mut, dich deines eigenen Verstandes zu bedienen! — Immanuel Kant

Mein Blog | Auf Twitter: @qquintilianus | PGP/GPG-Schlüssel: BF3A 614B D62B A4A0 C292 141C B875 5CB1 C592 A85A

Helft beim OpenRubyRMK, einem freien Programm zum erstellen von RPGs! (→ GitHub-Projekt)


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Probleme mit XML
BeitragVerfasst: 07 Jun 2012, 22:45 
Offline
Interpreter
Benutzeravatar

Registriert: 03 Jul 2006, 14:53
Beiträge: 4847
Wohnort: RLP
XPath und ein ordentlicher XML-Parser to the rescue:

require 'nokogiri'

xml = <
Musik und Gesellschaft

Arbeitsblätter für soziale Musikpflege und Musikpolitik
1930
Reprint:

Musik und Gesellschaft. [Berlin]

EOS

parsed = Nokogiri::XML(xml)
parsed.xpath("//p[not(node())]").remove

puts parse.inspect


Hintergrund: node() ist in XPath das Prädikat, dass aussagt, ob ein Knoten Kinder hat oder Text enthält. not() invertiert das und //p[...] selektiert alle p-Elemente von der Wurzel an.

Gruß,
Skade



Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Probleme mit XML
BeitragVerfasst: 08 Jun 2012, 10:52 
Offline
Rubyist

Registriert: 09 Jun 2009, 18:00
Beiträge: 323
Quintus hat geschrieben:
klausb hat geschrieben:
Leider ist die XML-Datei nicht so ganz regelkonform (zumindest nach meinen Begriffen).
Nicht nur nach deinen. Das ist kaputtes XML und ein strikter XML-Parser würde eine Verarbeitung verweigern.

Kurze Anmerkung meinerseits: Das XML ist syntaktisch natürlich vollkommen valide (well formed XML). Kein strikter Parser dürfte darüber stolpern. <p/> ist einfach ein leerer Node, der in einem anderen Node enthalten ist. Es gibt keine Regeln, die solche Konstrukte verbieten. Es ist durchaus wahrscheinlich dass das XML nicht die Intention ausdrückt die dahinter steht und dass die Tags versehentlich dort sind, aber das ist dem Parser egal. Solch ein Konstrukt kann nur durch ein Schema oder eine DTD verboten sein, aber da es keine DTD und kein Schema gibt ist eine echte Prüfung auf Konformität (valid XML) möglich.

_________________
Ruhe jetzt, sonst hol ich meinen kleinen Bruder.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Probleme mit XML
BeitragVerfasst: 08 Jun 2012, 10:56 
Offline
Rubyist

Registriert: 09 Jun 2009, 18:00
Beiträge: 323
Skade hat geschrieben:
XPath und ein ordentlicher XML-Parser to the rescue:

require 'nokogiri'

xml = <
Musik und Gesellschaft

Arbeitsblätter für soziale Musikpflege und Musikpolitik
1930
Reprint:

Musik und Gesellschaft. [Berlin]

EOS

parsed = Nokogiri::XML(xml)
parsed.xpath("//p[not(node())]").remove

puts parse.inspect


Hintergrund: node() ist in XPath das Prädikat, dass aussagt, ob ein Knoten Kinder hat oder Text enthält. not() invertiert das und //p[...] selektiert alle p-Elemente von der Wurzel an.

Gruß,
Skade




Das geht noch nen Zacken einfacher: Wenn man weiss dass die .text Property eines Nodes die Child-Nodes nicht mit ausgibt geht das hier:


1.9.3p125 :017 > parsed.xpath("//Bemerkungen")[0].text
=> "Reprint:Musik und Gesellschaft. [Berlin]"


Damit muss man nicht vorher alle potentiellen child-nodes entfernen.

edit: kleine Korrektur - der Text-Inhalt der Child-Nodes wird ausgegeben, nur die nodes selbst nicht. Es funktioniert also auch wenn die Child-Nodes Text enthalten, wie in diesem Beispiel:



require 'nokogiri'

xml = <
Musik und Gesellschaft

Arbeitsblätter für soziale Musikpflege und Musikpolitik
1930
Reprint:

Musik und Gesellschaft. [Berlin]

EOS

parsed = Nokogiri::XML(xml)
parsed.xpath("//Bemerkungen")[0].text
# => "Reprint:Musik und Gesellschaft. [Berlin]"


_________________
Ruhe jetzt, sonst hol ich meinen kleinen Bruder.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Probleme mit XML
BeitragVerfasst: 08 Jun 2012, 11:06 
Offline
Interpreter
Benutzeravatar

Registriert: 18 Sep 2008, 22:32
Beiträge: 1411
Wohnort: NRW → UN
xylakant hat geschrieben:
Kurze Anmerkung meinerseits: Das XML ist syntaktisch natürlich vollkommen valide (well formed XML). Kein strikter Parser dürfte darüber stolpern. <p/> ist einfach ein leerer Node, der in einem anderen Node enthalten ist. Es gibt keine Regeln, die solche Konstrukte verbieten. Es ist durchaus wahrscheinlich dass das XML nicht die Intention ausdrückt die dahinter steht und dass die Tags versehentlich dort sind, aber das ist dem Parser egal. Solch ein Konstrukt kann nur durch ein Schema oder eine DTD verboten sein, aber da es keine DTD und kein Schema gibt ist eine echte Prüfung auf Konformität (valid XML) möglich.
Ahhh, ich hab das als </p> gelesen.... Also ohne öffnendes <p>. Dass <p/> korrekt ist, weiß ich... Dabei hatte ich mich gestern noch mit Hanmac über genau dieses Konstrukt unterhalten... Ah, wie dämlich... Vergesst, was ich da oben geschrieben habe, das ist Unfug... :oops:

Valete,
Quintus

_________________
Habe den Mut, dich deines eigenen Verstandes zu bedienen! — Immanuel Kant

Mein Blog | Auf Twitter: @qquintilianus | PGP/GPG-Schlüssel: BF3A 614B D62B A4A0 C292 141C B875 5CB1 C592 A85A

Helft beim OpenRubyRMK, einem freien Programm zum erstellen von RPGs! (→ GitHub-Projekt)


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Probleme mit XML
BeitragVerfasst: 08 Jun 2012, 14:47 
Offline
Hacker
Benutzeravatar

Registriert: 08 Mai 2007, 20:03
Beiträge: 465
Wohnort: Köln
Vielen Dank an alle, die mich hier auf den rechten Weg gebracht haben.
Nach kurzem Studium von Nokogiri bin ich jetzt auf diese vorläufige(?) Lösung gekommen:
require 'nokogiri'

xml = Nokogiri::Slop <
Musik und Gesellschaft

Arbeitsblätter für soziale Musikpflege und Musikpolitik
1930
Reprint:

Musik und Gesellschaft. [Berlin]

EOS

puts xml.Zeitschrift.Bemerkungen.content
die mir genau das gewünschte ausgibt :D
Reprint:Musik und Gesellschaft. [Berlin]
Für den Rest muss ich mich noch genauer mit den Feinheiten von Nokogiri vertraut machen.

@Quintus
xmlsimple habe ich deshalb benutzt, weil ich das Projekt von meinem nicht mehr existenten Vorgänger übernommen habe und der hatte auch schon xmlsimple benutzt. Und wie es so ist, es muss sofort weitergehen...
Merkwürdigerweise hatte die Vorgängerversion vom XML-produzierenden Programm diese p-Nodes nicht mit drin. Die entstehen wohl, wenn in der Eingabemaske unerlaubterweise die Return-Taste gedrückt wird. Kann man den Mädels von der Dateneingabe leider nicht abgewöhnen :evil:

@xylakant
Ja, das XML ist für den Parser valid, aber für mein auswertendes Programm leider nicht...

Also nochmals, vielen Dank an alle. Ihr habt mir echt den Tag gerettet :D
klausb



Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach: