Forum: PC-Programmierung Python XML Parsing


von Sen S. (max_m11)


Lesenswert?

Hallo,

ich versuche aktuell mit Python ein Programm zu erstellen, das mir die 
Struktur eines XML Files dynamisch ausliest und als Dictionary 
wiedergibt.

Das Dictionary soll nach einlesen des folgenden XML-File-Beispiel so 
aussehen:

root
 |Items
 |   Item
 |     ...
 |   Item
 |     ...
 |Address
 |    Country
 |    ...
 |Address
 |    Country
 |    ...
 |DeliveryNotes

Mein Problem ist, dass ich nicht weiß, wie man mit den doppelt 
vorhandenen Namen umgehen soll (z.B. Item oder Address)



<?xml version="1.0"?>
<PurchaseOrder PurchaseOrderNumber="99503" OrderDate="1999-10-20">
  <Address Type="Shipping">
    <Name>Ellen Adams</Name>
    <Street>123 Maple Street</Street>
    <City>Mill Valley</City>
    <State>CA</State>
    <Zip>10999</Zip>
    <Country>USA</Country>
  </Address>
  <Address Type="Billing">
    <Name>Tai Yee</Name>
    <Street>8 Oak Avenue</Street>
    <City>Old Town</City>
    <State>PA</State>
    <Zip>95819</Zip>
    <Country>USA</Country>
  </Address>
  <DeliveryNotes>Please leave packages in shed by 
driveway.</DeliveryNotes>
  <Items>
    <Item PartNumber="872-AA">
      <ProductName>Lawnmower</ProductName>
      <Quantity>1</Quantity>
      <USPrice>148.95</USPrice>
      <Comment>Confirm this is electric</Comment>
    </Item>
    <Item PartNumber="926-AA">
      <ProductName>Baby Monitor</ProductName>
      <Quantity>2</Quantity>
      <USPrice>39.98</USPrice>
      <ShipDate>1999-05-21</ShipDate>
    </Item>
  </Items>
</PurchaseOrder>


Hier in dieser Funktion wird zum Beispiel das Element "Address" nur 
einmal auflistet, vermutlich weil actDict['Address'] einmal 
überschrieben wird.


def search(actNode, actDict):
    nodes = actNode.getchildren()
    for node in nodes:
        actDict[node.tag] = node.text

    return actDict

>>>
{'Items': '\n    ', 'DeliveryNotes': 'Please leave packages in shed by 
driveway.', 'Address': '\n    '}



Kennt ihr vielleicht eine Methode um dies zu umgehen? Mir ist bewusst 
dass ein Dicitonary nicht zwei gleiche Einträge haben kann, aber 
irgendwie muss man das XML File doch in einem Dicitonary abbilden 
können(?)

Ich bin für jeden Tipp dankbar :-)

Gruß

: Verschoben durch User
von |=~0x0F (Gast)


Lesenswert?

Andreas Sekinger schrieb:
> Ich bin für jeden Tipp dankbar :-)
Hier ist der erste:
"Forum: Projekte & Code

Hier könnt ihr eure Projekte, Schaltungen oder Codeschnipsel vorstellen 
und diskutieren. Bitte hier keine Fragen posten!"

von Sven B. (scummos)


Lesenswert?

Ich weiß, die Antwort ist blöd, aber: Warum willst du das machen? Es 
gibt haufenweise, wirklich haufenweise, Bibliotheken die XML in jeder 
nur denkbaren Form zugreifbar machen. Und diese Art von 
XML-Repräsentierung, die du dir da vorstellst, ist zudem noch 
unglaublich langsam und ressourcenfressend. Bist du sicher, dass du dein 
Problem nicht einfacher mit der vorhandenen API von zum Beispiel lxml 
lösen kannst?

Grüße,
Sven

: Bearbeitet durch User
von Test (Gast)


Lesenswert?

Den "Pfad" als eindeutigen String fuer den Listenindex bzw. Dict nutzen?
Tags und Struktur weiter abstrahieren in nodes mit attributen - wie lxml 
es macht...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.