Разбор XML-файла для неизвестных элементов с помощью Python ElementTree - PullRequest
3 голосов
/ 11 января 2012

Я хочу извлечь все имена тегов и соответствующие им данные из многоцелевого XML-файла. Затем сохраните эту информацию в словаре Python (например, тег = ключ, данные = значение). Улов, являющийся именами и значениями тегов, неизвестен и неизвестного количества.

    <some_root_name>
        <tag_x>bubbles</tag_x>
        <tag_y>car</tag_y>
        <tag...>42</tag...>
    </some_root_name>

Я использую ElementTree и могу успешно извлечь корневой тег и извлечь значения, ссылаясь на имена тегов, но не смог найти способ просто перебирать теги и данные без ссылки на имя тега.

Любая помощь будет отличной.

Спасибо.

Ответы [ 4 ]

6 голосов
/ 11 января 2012
from lxml import etree as ET

xmlString = """
    <some_root_name>
        <tag_x>bubbles</tag_x>
        <tag_y>car</tag_y>
        <tag...>42</tag...>
    </some_root_name> """

document = ET.fromstring(xmlString)
for elementtag in document.getiterator():
   print "elementtag name:", elementtag.tag

EDIT: Для чтения из файла, а не из строки

document = ET.parse("myxmlfile.xml")
2 голосов
/ 11 января 2012
>>> import xml.etree.cElementTree as et
>>> xml = """
...    <some_root_name>
...         <tag_x>bubbles</tag_x>
...         <tag_y>car</tag_y>
...         <tag...>42</tag...>
...     </some_root_name>
... """
>>> doc = et.fromstring(xml)
>>> print dict((el.tag, el.text) for el in doc)
{'tag_x': 'bubbles', 'tag_y': 'car', 'tag...': '42'}

Если вы действительно хотите 42 вместо '42', вам придется работать немного усерднее и менее элегантно.

1 голос
/ 11 января 2012

Вы можете использовать xml.sax.handler для анализа XML:

import xml.sax as sax
import xml.sax.handler as saxhandler
import pprint

class TagParser(saxhandler.ContentHandler):
    # http://docs.python.org/library/xml.sax.handler.html#contenthandler-objects
    def __init__(self):
        self.tags = {}
    def startElement(self, name, attrs):
        self.tag = name
    def endElement(self, name):
        if self.tag:
            self.tags[self.tag] = self.data
            self.tag = None
            self.data = None
    def characters(self, content):
        self.data = content

parser = TagParser()
src = '''\
<some_root_name>
    <tag_x>bubbles</tag_x>
    <tag_y>car</tag_y>
    <tag...>42</tag...>
</some_root_name>'''
sax.parseString(src, parser)
pprint.pprint(parser.tags)

выход

{u'tag...': u'42', u'tag_x': u'bubbles', u'tag_y': u'car'}
0 голосов
/ 11 января 2012

Это можно сделать, используя lxml в python

from lxml import etree

myxml = """
          <root>
             value
          </root> """

doc = etree.XML(myxml)

d = {}
for element in doc.iter():
      key = element.tag
      value = element.text
      d[key] = value

print d
...