Seite 1 von 1

Element löschen aus XML

Verfasst: Donnerstag 4. November 2010, 17:35
von ichisich
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_()

Re: Element löschen aus XML

Verfasst: Freitag 5. November 2010, 21:48
von Hyperion
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!

Re: Element löschen aus XML

Verfasst: Sonntag 7. November 2010, 19:31
von ichisich
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ß

Re: Element löschen aus XML

Verfasst: Sonntag 7. November 2010, 21:00
von Hyperion
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 ;-)