Problem mit XML Parsing

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
Stonedarmy
User
Beiträge: 14
Registriert: Dienstag 27. Juni 2006, 09:44

Hallo,

Ich habe ein Problem mit meinem XML-Parser.

Also ich Parse das ganze Zeug und Schreibe es in eine DB, das einzige Problem das ich habe ist das ich leere Felder in die DB bekomme...

Code: Alles auswählen

 <prf:BitsPerPixel>16</prf:BitsPerPixel> 
  <prf:ColorCapable>Yes</prf:ColorCapable> 
  <prf:ScreenSize>208x320</prf:ScreenSize> 
  <prf:ImageCapable>Yes</prf:ImageCapable> 
- <prf:InputCharSet> [u][b]# das Problem ist hier.[/b][/u]
- <rdf:Bag>
  <rdf:li>ISO-8859-1</rdf:li> 
  <rdf:li>ISO-8859-2</rdf:li> 
  <rdf:li>ISO-8859-4</rdf:li> 
  <rdf:li>ISO-8859-5</rdf:li> 
  <rdf:li>ISO-8859-7</rdf:li> 
  <rdf:li>ISO-8859-9</rdf:li> 
  <rdf:li>WINDOWS-1252</rdf:li> 
Da dieses Feld keinen Value besitzt schreibt es mir dann immer ein paar Leerzeichen in die DB.

Ich habe schon Probiert anzugeben das wenn der Wert des Feldes "Leerzeichen" sind, er es nicht in die DB einfügen soll das geht nicht.

Auch habe ich Probiert die Felder gleich nach dem Einfügen wieder zu Löschen das klappt auch nicht.

Kann mir bitte jemand Helfen zumindest mit einer Idee.

Danke schon im Voraus 8)
BlackJack

Du schreibst nicht was Du da genau rausholen willst, wie Du das im Moment tust und auf was für eine Datenstruktur das in der Datenbank abgebildet werden soll. Das macht es schwer zu helfen.

Ausser "Wenn eine leere Zeichenkette, bzw. eine die nur aus 'whitespaces' besteht, ausgelesen wird, dann schreib halt nix in die Datenbank.", fällt mir dazu nichts weiter ein. Das kann man mit der`strip()`-Methode testen.
Stonedarmy
User
Beiträge: 14
Registriert: Dienstag 27. Juni 2006, 09:44

ok ich probier's mal etwas besser zu erklären...

Dieser XML ausschnitt ist aus einem "UAprofile".
Die Dinger sind Ziemlich lang......
Für jedes Handy(typ) das meine Firma verkauft gibt es so eines das heisst, dass sie alle unterschiedlich sind.


Jetzt will unser Handy Manager eine Applikation mit der er Werte aus diesem XML auslesen kann, diese kommen dann in eine DB.
Zweck ist, dass er effizient konfigurationen an unserem WAP Portal vornehmen kann.

Also muss der Parser unabhanig von irgendwelchen "Namen", "Tag Anzahl" usw funktionieren.

Die Applikation ist soweit fertig das einzige Problem ist das ich diese "Whitespaces in die DB bekomme und die nützen doch nichts.

Ich arbeite mit Minidom.

Mein Programm funktioniert so:

Ich klappere alle Hyrachiestufen des XML files durch wenn ich auf der Stufe von diesen "prf:????" bin will der Parser natürlich auch die Values zu <prf:InputCharSet> herauszuholen diese sind aber in einem Bag.
Wie kann ich machen das er die blöden Leerzeichen nicht in die DB kopiert.

Code: Alles auswählen


for subchildNode in childNode.childNodes:
  if subchildNode.hasChildNodes():
     for subsubChildNode in subchildNode.childNodes:
         if subsubChildNode.hasChildNodes():

            NonBagValues = subsubChildNode.childNodes[0].nodeValue

            c.execute("""INSERT INTO tblUAprofValue (ValueName, LastUpdate, AttributeID) VALUES ('%s', '%s', '%s')"""%(NonBagValues, time.ctime(), FormattedID2))
Natürlich sind noch abfragen drin, um zu Prüfen ob der Value schon in der DB ist. Aber die Whitespaces macht er trotzdem auch wenn ich 2X das selbe Prof. durchlasse.

Kannst du jetzt mein Problem verstehen?

Gruss Reto
BlackJack

Nee ich verstehe das Problem nicht wirklich. Erstmal scheint es ziemlich "komisch" ein XML auf diese Weise in eine Datenbanktabelle zu speichern. Wenn ich das richtig sehe dann wird in der Spalte `ValueName` ein XML-Fragment gespeichert!? Und was ist `FormattedID2`?

Und dann vermisse ich hier irgendwie den Test, ob es sich bei ``str(NonBagValues)`` nur um "whitespace" handelt. Das musst Du doch nur vorher prüfen und nur dann das `execute()` ausführen, wenn da wirklich Inhalt drinsteht.

Last but not least, bitte die Anführungszeichen um die %s aus dem SQL nehmen und das % durch ein Komma ersetzen. Einfügen von Werten sollte man immer der Datenbank überlassen. Im schlimmsten Fall hättest Du sonst eine Sicherheitslücke. Oder irgendwann stehen mal Anführungszeichen im XML, dann fällt das Konstrukt auch auf die Nase.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Stonedarmy hat geschrieben:Da dieses Feld keinen Value besitzt schreibt es mir dann immer ein paar Leerzeichen in die DB.
Hi Stonedarmy!

Ob du die korrekten Daten aus deinem XML-File heraus bekommst, das ist eine andere Sache. Ich gehe jetzt einfach mal davon aus, dass das so stimmt.

Code: Alles auswählen

NonBagValues = subsubChildNode.childNodes[0].nodeValue.strip() | None
Und dann noch, so wie von BlackJack erklärt, die Ersetzung von der Datenbankschnittstelle erledigen lassen. Diese kümmert sich dann darum, dass wenn ein String übergeben wird, die Anführungszeichen gesetzt und wenn None übergeben wird, diese weg gelassen werden.
Damit das so funktioniert muss das Tabellenfeld natürlich auch so konfiguriert sein, dass es NULL erlaubt.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Stonedarmy
User
Beiträge: 14
Registriert: Dienstag 27. Juni 2006, 09:44

Problem gelöst.



@ BlackJack:
Danke für die Tipps, werde sie berücksichtigen.
Wiso das ich das so mache --> Mein Chef wollte das so!(ich bin Lehrling)


@ Gerold:
Natürlich auch an dich ein Dankeschön


Schönen Tag noch.... meiner ist jetzt gerettet :D
Antworten