Element löschen aus XML

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

Hi zusammen,

das XML-Zeugs treibt mich noch in den Wahnsinn ....

Was ich möchte ist ein Element des XMLs löschen. Wissen tue ich das Element ("scenario") und das Attribut ("name") so wie den Wert von dem Attribut.
(Stimmen die Bezeichnungen so ? )

Mit meinem Beispiel komm ich auch an den Knoten, weiß aber jetzt nicht weiter wie ich den Lösche. Ich Benutze wie ihr seht die Qt-XML Klassen. Ob das Sinnvoll ist weiß ich nicht. Auch ob gerade diese Klassen Sinnvoll sind weiß ich nicht. Falls jemand da einen einfacheren Ansatz hat gerne.

Folgendes als Beispiel:
Das ist ein reines Test-Skript also die vielen Imports und Unstimmigkeiten einfach ignorieren.

Eingabe ist dann "s1" oder "s2"

Code: Alles auswählen

# -*- coding: UTF-8 -*-
from __future__ import unicode_literals

from PyQt4.Qt import Qt
from PyQt4.QtGui import (QProgressBar, QSpinBox, 
                         QDialog, QApplication,
                         QMainWindow, QLineEdit,
                         QRegExpValidator, QLabel,
                         QHBoxLayout, QWidget, 
                         QInputDialog, QCommandLinkButton,
                         QTextEdit, QPushButton,
                         QFileDialog)

from PyQt4.QtCore import (QProcess, SIGNAL,
                          QString,QStringList,
                          QRegExp, QVariant)

from PyQt4.QtXml import QDomDocument,QDomNode
import sys


class Dialog(QInputDialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)

class Test(QMainWindow):

    def __init__(self, parent = None):
        super(Test, self).__init__(parent)
        self.widget = QWidget()
        self.layout = QHBoxLayout(self.widget)
        self.setCentralWidget(self.widget)
        self.textEdit = QTextEdit(self)
        self.label = QLabel(self)
        self.pushButton = QPushButton(u"Eingabe", self)
        self.layout.addWidget(self.pushButton)
        self.layout.addWidget(self.label)
        self.layout.addWidget(self.textEdit)
        self.pushButton.clicked.connect(self.deleteScenario)

    def deleteScenario(self):
        dom = self.newScenarioXml()
        self.textEdit.setPlainText(dom.toString(1))
        name, ok = QInputDialog.getText(self, "", "scenario name: ")
        if ok:
            nodeList = dom.elementsByTagName("scenario")
            for index in range(nodeList.count()):
                node = nodeList.item(index)
                attibute = node.attributes().namedItem("name")
                value = attibute.nodeValue()
                if value == name:
                    self.textEdit.append("Name gefunden: %s" % value)

            
    def newScenarioXml(self):
        dom = QDomDocument()
        xmlString = u"""<?xml version='1.0' encoding='UTF-8'?>
                        <!DOCTYPE TEST>
                        <TEST VERSION='1.0' >
                         <project path='C:/Users/test/Desktop/Test' name='Test_123' >
                              <scenario path='s1' active='no' name='s1' />
                              <scenario path='s2' active='no' name='s2' />
                         </project>
                        </TEST>"""
        dom.setContent(QString(xmlString))
        return dom
            
if __name__ == '__main__':
    app = QApplication(sys.argv)
    t = Test()
    t.show()
    app.exec_()
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wie wärs damit?
http://doc.qt.nokia.com/4.6/qdomnode.html#removeChild

Und nebenbei: Dieser XML-Code ist hoffentlich nur zu Demozwecken da? Ansonsten baut man den ja nicht per Hand in einem String zusammen :D

Ansonsten: Sieht schon viel sauberer aus als Dein bisher gezeigtes!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

Ja ja die vielen Bäume und kein Wald ....
Die Funktion war mir bekannt. Wie sie genau anwenden kam mir aber erst am nächsten Tag mit dem nötigen Abstand.

Der Vollständigkeithalber:

Code: Alles auswählen

    def deleteScenario(self):
        name, ok = QInputDialog.getText(self, "", "scenario name: ")
        if ok:
            nodeList = self.dom.elementsByTagName("scenario")
            for index in range(nodeList.count()):
                node = nodeList.item(index)
                attibute = node.attributes().namedItem("name")
                value = attibute.nodeValue()
                if value == name:
                    self.textEdit.append("Name gefunden: %s" % value)
                    self.replace(node)
                    break
    
    def replace(self, node):
        # es gibt nur ein "project" element darum 0
        firstElement = 0
        parent = self.dom.elementsByTagName("project")
        newParent = parent.item(firstElement).removeChild(node)
        self.dom.replaceChild(newParent, parent.item(firstElement))
        self.textEdit.setPlainText(self.dom.toString(1))
Dieser XML-Code ist hoffentlich nur zu Demozwecken da? Ansonsten baut man den ja nicht per Hand in einem String zusammen :D

Ansonsten: Sieht schon viel sauberer aus als Dein bisher gezeigtes!
Das es sich um Demo/Test-Code handelt schrieb ich ja. Was Du mit "Ansonsten" meinst versteh ich nicht ganz aber wenn Du meinst !

Anyway, Danke für die Antwort.

Gruß
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

ichisich hat geschrieben: Was Du mit "Ansonsten" meinst versteh ich nicht ganz aber wenn Du meinst !
Na, Du hattest schon eine Frage in einem anderen Thread gestellt. Und jetzt sieht Dein Code schon besser aus als damals ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten