Получите список значений атрибута XML в Python

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

13
задан jh314 29 July 2013 в 22:13
поделиться

6 ответов

Я не действительно опытный человек в Python, но здесь являюсь решением XPath с помощью libxml2.

import libxml2

DOC = """<elements>
    <parent name="CategoryA">
        <child value="a1"/>
        <child value="a2"/>
        <child value="a3"/>
    </parent>
    <parent name="CategoryB">
        <child value="b1"/>
        <child value="b2"/>
        <child value="b3"/>
    </parent>
</elements>"""

doc = libxml2.parseDoc(DOC)

def getValues(cat):
    return [attr.content for attr in doc.xpathEval("/elements/parent[@name='%s']/child/@value" % (cat))]

print getValues("CategoryA")

С результатом...

['a1', 'a2', 'a3']
7
ответ дан 1 December 2019 в 22:24
поделиться

ElementTree 1.3 (к сожалению, не 1.2, который является тем, включенным с Python) XPath поддержек как это:

import elementtree.ElementTree as xml

def getValues(tree, category):
    parent = tree.find(".//parent[@name='%s']" % category)
    return [child.get('value') for child in parent]

Тогда можно сделать

>>> tree = xml.parse('data.xml')
>>> getValues(tree, 'CategoryA')
['a1', 'a2', 'a3']
>>> getValues(tree, 'CategoryB')
['b1', 'b2', 'b3']

lxml.etree (который также обеспечивает, интерфейс ElementTree) будет также работать таким же образом.

6
ответ дан 1 December 2019 в 22:24
поделиться

Используя стандартный W3 DOM, такой как minidom stdlib или pxdom:

def getValues(category):
    for parent in document.getElementsByTagName('parent'):
        if parent.getAttribute('name')==category:
            return [
                el.getAttribute('value')
                for el in parent.getElementsByTagName('child')
            ]
    raise ValueError('parent not found')
3
ответ дан 1 December 2019 в 22:24
поделиться

Я должен признать, что я - поклонник xmltramp из-за его простоты использования.

вышеупомянутое Доступа становится:

  import xmltramp

  values = xmltramp.parse('''...''')

  def getValues( values, category ):
    cat = [ parent for parent in values['parent':] if parent(name) == category ]
    cat_values = [ child(value) for child in parent['child':] for parent in cat ]
    return cat_values

  getValues( values, "CategoryA" )
  getValues( values, "CategoryB" )
2
ответ дан 1 December 2019 в 22:24
поделиться

Можно сделать это с BeautifulSoup

>>> from BeautifulSoup import BeautifulStoneSoup
>>> soup = BeautifulStoneSoup(xml)
>>> def getValues(name):
. . .      return [child['value'] for child in soup.find('parent', attrs={'name': name}).findAll('child')]

при выполнении работы с HTML/XML, я рекомендовал бы смотреть на BeautifulSoup. Это подобно дереву DOM, но содержит больше функциональности.

2
ответ дан 1 December 2019 в 22:24
поделиться

Мой предпочтительный Python xml библиотека lxml, который обертывает libxml2.
Xpath действительно кажется способом пойти сюда, таким образом, я записал бы это как что-то как:

from lxml import etree

def getValues(xml, category):
    return [x.attrib['value'] for x in 
            xml.findall('/parent[@name="%s"]/*' % category)]

xml = etree.parse(open('filename.xml'))

>>> print getValues(xml, 'CategoryA')
['a1', 'a2', 'a3']
>>> print getValues(xml, 'CategoryB')
['b1', 'b2', 'b3]
2
ответ дан 1 December 2019 в 22:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: