XML: Zwei RootElemente unterschiedlicher Art
-
nabend,
ich habe da ein Problem mit der Chilkat-lib. Das gleiche Problem hab ich auch mit der TinyXml. Ich bekomme über eine inet Verbindung xml-Stückchen zugeschickt. Teilweise beinhalten sie aber mehrere Dinge.
<element1> <info>bla</info> </element1> <element2> <sthdifferent>blubb</sthdifferent> </element2>
Ein Einlesen mit der Chilkat ist nur bedingt möglich. Die Chilkatlib beginnt offensichtlich von hinten, denn mach ich folgendes (gilt für beide libs ähnlich)
doc.Load(); doc.GetDocument();
so bekomme ich als ergebnis bei der chilkat folgendes ergebnis
<element2> <sthdifferent>blubb</sthdifferent> </element2>
bei der TinyXml das gleiche, nur mit element1. Die Frage ist: Wie trenne ich die beiden elemente am Besten voneinander?
bei der Chilkat habe ich folgendes Versucht:
CkString buf; CkString bufs; xml.LoadXml(buf.getString()); xml.GetXml(bufs); buf.replaceChar((char)bufs.getString(), (char) " "); int shortenSize = bufs.getSize(); buf.shorten(shortenSize); xml.Save();
das ergebnis sieht fast gut aus. Es fehlen aber ein paar Zeichen. Der String wird zu früh abgeschnitten. Wo sind diese verloren gegangenen zeichen? Ist der Lösungsweg denn einigermaßen akzeptabel oder gibt es eine möglichkeit, das ganze etwas eleganter zu lösen?
gruß
Tobias
-
Dein Problem liegt beim fehlenden Verständnis zu Aspekten von XML:
-
Es existiert pro Dokument nur ein Rootelement, sonst spinnt der Parser, wie zu ersehen ist.
-
Siehe dir mal Xpath an, dann wird in Zukunft alles leichter.
http://www.informatik.hu-berlin.de/~obecker/obqo/w3c-trans/xpath-de/
-
-
das verständnis is soweit da. denn ich sagte bereits, dass ich die beiden teile voneinander trennen möchte. Bei einer Jabber-Verbindung bekommt man nun mal lediglich fragmente eines kompletten dokuments. Kommmen mehrere Dinge aufeinmal an, dann werden diese in einem mal verschickt. und zwar werden diese aneinandergehängt. Ich produziere dieses invalide dokument ja nicht. (bevor einer meckert: ich weiß, dass ein einzelnes fragment, ohne eine deklaration (<?xml...), auch nicht valides xml ist.)
Von xpath habe ich tatsächlich keine Ahnung. Ich werde mich einlesen und hoffen, dass das mein Problem löst.
-
Bau doch einfach den fehlenden Teil drum rum. Ungefähr so:
string machMalGuelting (const string& kaputtesXml) { return "<MeinErsatzRoot>\n" + kaputtesXml + "\n</MeinErsatzRoot>"; }
Dann hast du nur noch einen Root-Node und kannst von dort aus ganz normal die Kinder abholen.
-
hab ich mir auch überlegt..ich glaube aber nicht, dass das so sinnig ist. klar, das funktioniert. wer sich schonmal mit jabber beschäftigt hat, der weiß, dass eine 'session' mit dem server aufgebaut ist wie ein xml-file. Es beginnt mit dem wurzelelement <stream>. dazwischen kommen eben die childs. nachträglich, alles in einzelenen schüben. ich will meinem parser sagen: pass auf..es beginnt mit stream dann kommt was und erst dann, irgendwann, endet es. ich werd mich mal umsehen und anschaun, wie es andere jabber-clients machen.