XML effizient analysieren

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Karolus
********
Beiträge: 7440
Registriert: Mo, 02.01.2006 19:48

Re: XML effizient analysieren

Beitrag von Karolus »

Hallo

Code: Alles auswählen

    if elem.get('{%s}anchor-type'%ns['text']) == 'page':
das erklär ich nochmal ausführlicher - am Anfang der xml-Datei befindet sich ein mapping von `kurzen_namen` auf vollständige "bezeichner" hier mal etwas formatiert:

Code: Alles auswählen

xmlns:office= "urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
xmlns:style= "urn:oasis:names:tc:opendocument:xmlns:style:1.0"
xmlns:text= "urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
xmlns:math="http://www.w3.org/1998/Math/MathML"
xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
xmlns:ooo="http://openoffice.org/2004/office"
xmlns:ooow="http://openoffice.org/2004/writer"
xmlns:oooc="http://openoffice.org/2004/calc"
xmlns:dom="http://www.w3.org/2001/xml-events"
xmlns:xforms="http://www.w3.org/2002/xforms"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:rpt="http://openoffice.org/2005/report"
xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:grddl="http://www.w3.org/2003/g/data-view#"
xmlns:tableooo="http://openoffice.org/2009/table"
xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0"
office:version="1.2"
grddl:transformation="http://docs.oasis-open.org/office/1.2/xslt/odf2rdf.xsl"
elem.get(...) benötigt als Argument diesen vollen Bezeichner zum Namen `Text` eingefasst in {}geschweiften klammern und gefolgt von Variablen-namen selbst.

Code: Alles auswählen

'{%s}anchor-type' %ns["Text"] #ersetzt `%s`durch den Bezeichner zu `Text` aus dem mapping oben 
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Dreh-Gel
**
Beiträge: 28
Registriert: Sa, 25.10.2014 16:58

Re: XML effizient analysieren

Beitrag von Dreh-Gel »

Hallo Stephan,
Stephan hat geschrieben:@Dreh-Gel

Deine Aussagen öffnen mir die Augen das es mit Reg-Ex ganicht bzw. nur sehr sehr kompliziert geht (bisher war ich der Meinung es ginge relativ leicht, meine Gründe Reg-Ex eher nicht zu wollen waren Andere)
Ganz generell: RegEx sind dann gut, wenn es sich um eine "Reguläre Grammatik" handelt, das ist der am wenigsten komplexe Fall der Chomsky Hierarchie. Das ist bei XML-Dateien generell nicht der Fall. Genau so eignen sich RegExe nicht zum Parsen von HTML. Jedenfalls nicht den gesamten Sprachumfang. Allerdings gelegentlich will man gar nicht XML oder HTML parsen, sondern nur ein paar Informationen rausholen. So wie bei Dir. Dann kanns durchaus gehen.

Kurz gesagt, wenn du geschachtelte Regeln hast, zb. Draw-Frame im Draw-Frame, dh man muss das Ende-Tag dem Anfangs-Tag zuordnen, (also Schachtelung oder Sequenz unterscheiden) dann geht das über einen RegEx hinaus und man muss tricksen, bzw den Rest des Parsers um den RegEx drumherum schreiben. Geht es nur ein bisschen über die Reguläre Grammatik hinaus, dann kanns noch gehen, aber es wird schnell kompliziert. Es gibt ja XML-Parser, sei es der aus Open Office oder SAX. Leider habe ich mit denen keine Erfahrungen.

Hat man jedoch einen Sprachteil, der nicht geschachtelt ist oder es gibt sonstige Vereinfachungen, dann können RegExe doch in Betracht kommen. Das hängt davon ab, welcher Grammatik der erzeugte Text entspricht. Der OpenOffice Generator wird nicht den gesamten Sprachumfang von XML erzeugen, dh dass auch der Parser einfacher ist. Allerdings muss man dazu wissen, was der Generator nun genau erzeugt und ggf überprüfen, ob das in der nächsten Version auch noch so ist.
Stephan hat geschrieben: nochmals zur Erklärung, das RegEx müsste (im ersten Schritt) folgenden (hier allgemein codiert/beschrieben) Abschnitt finden (rot markiert):

<draw:frame [...] </draw:frame> [...] <draw:frame [...] </draw:frame> [...] <text:p> [...] </text:p>

dürfte aber NICHT Folgenden finden (die Rotmarkierung betrifft hier nur das was man wohl FÄLSCHLICH als zu finden ansieht):

<draw:frame [...] <draw:frame [...] </draw:frame><text:p> [...] </text:p> [...] </draw:frame>

Gruß
Stephan
Hier sind geschachtelte Draws möglich. Das geht über einen RegEx hinaus. In deinem Beispiel ganz oben hast du geschrieben:
<!-- Abschnitt B -->
Das hätte man sehr gut mit RegEx erkennen können. Aber sowas ist nicht im Text drinnen. Man könnte über RegExe nachdenken, wenn man sowas reinkriegen könnte. Zb wenn man wüsste, in welcher Reihenfolge er alle Draws nacheinander in die Datei schreibt und man wüsste, was man tun muss, um danach ein Element mit einem bestimmten Namen zu erzeugen. Ich würde schon erwarten, dass das möglich sein sollte. Wie das mit dem Aufwand ist, ist aber eine andere Frage.

Aber das hängt alles davon ab, was du vor hast, wo die Dokumente herkommen und wie langlebig und stabil die Lösung sein soll.

In Summe scheint mir, dass Axels und Karolus' Vorschlag der bessere und langlebigere ist. Wenn die Schachtelung so ist und eventuell noch andere Unwägbarkeiten im Generator sind, dann ist es sicherer über das Objektmodell zu gehen.

Gruss
DG

Gerade erst gelesen:
Stephan hat geschrieben:Oder die faktische Gesamtaufgabe (nicht alles aber 99% davon):
wie mache ich aus den content.xml mehrerer odt-Dokumente eine content.xml die zu einer Darstellung des Gesamtdokumentes führt als würden die aneinandergereihten Teildokumente am Bildschirm so aussehen als verhielten sie sich als DTP-Dokumente, d.h. absolut verankerte Elemente werden an den nun quasi neuen, richtigen Positionen dargestellt.
Du willst nicht nur Informationen extrahieren, sondern auch noch ein neues Dokument generieren, syntaktisch und semantisch richtig zusammenbauen und es geht um ziemlich viel Text. Karolus hat recht; das geht definitiv deutlich über RegEx hinaus.
Win7, AOO 4.1.1
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: XML effizient analysieren

Beitrag von Stephan »

Ja das steht doch im node:... text:anchor-type="page"


oh je bin ich unaufmerksam. Ja, stimmt das steht dort und dessen war ich mir eigentlich auch bewusst.

Du hast somit völlig recht, zumal dieses Herangehen ja schon im Grundsatz besser ist, denn damit werden automatisch wirklich nur die richtigen draw-frame erfasst.
im Beispielscode oben frage ich diese Eigenschaft ab mit der Zeile
Hast Du eine Antwort in Basic? Probieren brauchst Du nicht das kann ich auch selbst, also nur wenn Du es direkt weist. (Das quasi Rahmenmakro für den Zugriff auf die Nodes steht oben im Thread)



Gruß
Stephan
Karolus
********
Beiträge: 7440
Registriert: Mo, 02.01.2006 19:48

Re: XML effizient analysieren

Beitrag von Karolus »

Hallo
Hast Du eine Antwort in Basic?
Nee, `lxml.etree` ist ja eine python-lib, und da hab ich gestern schon einige Haare verloren bis ich diesen verflixten xml-Kram ein wenig kapiert hab, das tue ich mir jetzt nicht nochmal mit den kruden api-methoden an.

Wenn ich in der Richtung mehr machen müsste würde ich einen Blick auf odfpy werfen.
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Antworten