[Python-de] XML mit LXML einlesen , wobei die Struktur nicht alltäglich ist.

Stefan Behnel python-de at behnel.de
Di Mär 24 14:41:53 UTC 2009


Thomas Gebhard schrieb:
> Stefan Behnel wrote:
>> Also sowas (völlig ungetestetes):
>>
>>     class bigfile(object):
>>         def __init__(self, files):
>>              self.files = iter(files)
>>              self.next_file = None
>>         def read(self, size=8192):
>>              if self.files is None:
>>                  return ''
>>              data = ''
>>              try:
>>                  if self.next_file is None:
>>                      data = "<root>"
>>                      self.next_file = self.files.next()
>>                  else:
                        # ähem ...
                        data = self.next_file.read(size)
>>                      while not data:
>>                          self.next_file = self.files.next()
>>                          data = self.next_file.read(size)
>>              except StopIteration:
>>                  data += "</root>"
>>                  self.files = None
>>              return data


>>> Das zweite Problem das ich hatte, war dass es Element gibt die wie
>>> folgt ausschauen:
>>> <source:title></source:title>
>>> <weblog:weblog_type></weblog:weblog_type>
>>>
>>> LXML interpretierte hier immer source als auch weblog als Namespaces,
>>> die im Header jedoch nicht definiert wurden.
>>
>> Dann benutz doch als öffnendes Root-Tag
>>
>>     '<root xmlns:source="" xmlns:weblog="">'
>>
>> Damit setzt du die Präfixe auf den leeren Namespace, so dass die
>> Elemente dann ohne Namespace aus dem Parser zurück kommen.
>>
> Das habe ich jetzt schon ausprobiert, jedoch bekomme ich die Meldung
> dass die Angegebene URI nicht gültig ist:
> <root xmlns:source="" xmlns:weblog="" xmlns:dc="" xmlns:atom="">
> lxml.etree.XMLSyntaxError: xmlns:source: '' is not a valid URI, line 1,
> column 19

Richtig, libxml2 2.7.x, ich vergaß. Dann setz eben die richtigen Namespace
URIs ein (oder eben nur irgendwelche). Damit sehen dann zwar die Tags der
entsprechenden Elemente etwas länger aus, aber das sind auch nur Strings,
die sich wunderbar in eine Variable schieben lassen. Und dafür hast du
dann am Ende Namespace-korrektes XML.

Stefan




Mehr Informationen über die Mailingliste python-de