XML parsen / Inhalt Anderen zur Verfügung stellen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

Montag 9. Februar 2009, 09:31

Hallo,

ist etwas komplizierter, aber ich hoffe, daß ich es verständlich erklärt bekomme.

Ich habe eine XML, deren Inhalt ich nicht kenne.
Ich möchte den Inhalt dieser Datei speichern, um ihn später Anderen zur Verfügung zu stellen.

Der Zugriff auf die Daten soll dann über Methoden von mir gekapselt sein, so daß der Andere
nicht mitbekommt, daß es sich um XML handelt. Der Zugriff soll lesend und schreibend möglich sein.

Das heißt ich müßte das unbekannte Stück XML in einer Datenstruktur aufbereiten, die
XML sinnvoll abbilden kann und die beliebig erweitert werden kann.

Es schweben mir zwei Lösungansätze vor:
1) Ich parse den XML Fetzen in eine Mischung aus Listen und Dictionaries
2) Ich nehme den XMl Fetzen wie er ist, halte ihn im Speicher und nutze die Methoden von z.B. ElementTree
um den XML-Fetzen auszulesen und zu erweitern. Diese Methoden würde ich dann nochmal kapseln.

Attribute sollen generell nicht möglich sein und ich möchte ein XML-Modul nutzen,
welches Standardmäßig ab Python 2.5 enthalten ist. Deswegen schwebt mir ElementTree vor.

Ich tendiere zu Vorschlag 2, bin mir aber nicht sicher, ob ich evtl. doch etwas übersehen habe.
Deswegen meine Frage: Wie würdet ihr es machen?

Gruß
Nergal
Zuletzt geändert von Nergal am Montag 9. Februar 2009, 17:08, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Montag 9. Februar 2009, 10:06

Nergal hat geschrieben: Ich habe eine XML, deren Inhalt ich nicht kenne.
Aber die Struktur? (z.B. durch DTD / XSD)
Ich möchte den Inhalt dieser Datei speichern, um ihn später Anderen zur Verfügung zu stellen.
Was ist denn Inhalt? Die Daten zwischen den "Tags"
Bsp:

Code: Alles auswählen

<foo>bar</foo>
Wäre hier nur "bar" der Inhalt?
Der Zugriff auf die Daten soll dann über Methoden von mir gekapselt sein, so daß der Andere
nicht mitbekommt, daß es sich um XML handelt. Der Zugriff soll lesend und schreibend möglich sein.
Wie passt das zum "Inhalt speichern"? Willst Du einen Teil der ursprünglichen XML-Datei separat speichern und dann darauf weiterarbeiten?

Attribute sollen generell nicht möglich sein
Attribute im XML oder was meinst Du hier?

Mir fehlt hier der genaue Überblick, um Dir wirklich einen Tipp geben zu können!
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

Montag 9. Februar 2009, 10:13

Über die Struktur kann ich auch keine Annahmen machen.

Es muss später bekannt sein, daß foo ein Element ist und den Inhalt bar hat bzw. auch wieder Elemente als Inhalt. Über die Tiefe der Verschachtelung kann ich auch keine Annahmen machen.

Die XML an sich soll nicht verändert werden. Sprich bei jedem Auslesen der XML bekommt man den gleichen Inhalt, mit dem man dann aber weiterarbeiten kann (auslesen, Inhalte zufügen) und ggf. seperat abspeichern. Die ursprüngliche XML-Datei soll quasi nur Datenbasis für den ersten Aufruf sein.

Die Attribute beziehen sich auf die XML.

Ich weiß leider nicht, wie ich es besser erklären soll.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Montag 9. Februar 2009, 10:34

Wenn das alles so ist, wirst Du einen XML-Parser quasi nur nach implementieren! Da wird es imho keinen erkennbaren Mehrwert geben ...

Da Du ja aber eine Schnittstelle nachbaust, muss es ja jemanden geben, der das XML später behandelt und verarbeitet. Am besten derjenige schreibt sich dann eine für ihn passende Schnittstelle, die konkret Inhalte manipuliert.
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

Montag 9. Februar 2009, 10:50

Da fällt mir ein, ich hab was wichtiges vergessen :oops:

Der Anwender kennt die Struktur und den Inhalt.
Sprich er schreibt sowas wie `` Content = GetContent("foo") `` und bekommt dann bar.

Er soll aber nicht direkt die Methoden von ElementTree nutzen und nur auf der Datenbasis der XML arbeiten; nicht auf der XML-Datei selbst.

Deswegen hatte ich die Idee, den XML Inhalt als String im Speicher zu halten und dort ggf. zu erweitern. Da ich sonst, wie du auch erwähnt hast, XML quasi neu erfinden müßte.

Es soll quasi eine universale Schnittstelle werden, über die der Anwender auf eine, ihm bekannte, XML zugreifen kann. Diese kann er auslesen und erweitern, aber über die von mir geschriebenen Methoden.

Hört sich erstmal evtl. komisch an, aber es macht in meiner Situation Sinn.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Montag 9. Februar 2009, 10:56

Nergal hat geschrieben: Er soll aber nicht direkt die Methoden von ElementTree nutzen und nur auf der Datenbasis der XML arbeiten; nicht auf der XML-Datei selbst.
Wieso das?
Es soll quasi eine universale Schnittstelle werden, über die der Anwender auf eine, ihm bekannte, XML zugreifen kann. Diese kann er auslesen und erweitern, aber über die von mir geschriebenen Methoden.
Python Doku hat geschrieben: The Element type is a flexible container object, designed to store hierarchical data structures in memory. The type can be described as a cross between a list and a dictionary.
Klingt verdammt ähnlich ;-) (Bis auf den Teil "soll aber Funktionen von mir nutzen!")

Wozu willst Du das Rad neu erfinden? Du sagst ja noch, dass es in Deiner SItuation Sinn macht - ich kann das aufgrund Deiner Infos aber überhaupt nicht nachvollziehen!
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Montag 9. Februar 2009, 12:35

Wahrscheinlich hat er fest definierte Schnittstellen.

In diesem Fall machst du einfach einen Wrapper, der die Methoden von ElementTree weiterleitet.
Zum Beispiel:

Code: Alles auswählen

def GetContent(el, section):
    return el.get(section)
Oder hast du dir da was anderes vorgestellt?
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

Montag 9. Februar 2009, 12:57

ice2k3 hat geschrieben:Wahrscheinlich hat er fest definierte Schnittstellen.

In diesem Fall machst du einfach einen Wrapper, der die Methoden von ElementTree weiterleitet.
Zum Beispiel:

Code: Alles auswählen

def GetContent(el, section):
    return el.get(section)
Oder hast du dir da was anderes vorgestellt?
Unter anderem liegt es daran. Außerdem möchte ich den Zugriff kapseln.

Danke für die schnelle und kompetente Hilfe; werde mir einen Wrapper schreiben, der meinen Anforderungen gerecht wird.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Montag 9. Februar 2009, 18:43

ice2k3 hat geschrieben:Wahrscheinlich hat er fest definierte Schnittstellen.
Das war jetzt aber /dev/glaskugel ;-) ... erwähnt hat er es ja nicht!
Antworten