15

Python で子要素から属性値のリストを取得する必要があります。

例を挙げて説明するのが最も簡単です。

次のような XML があるとします。

<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>

私は次のようなことができるようにしたい:

>>> getValues("CategoryA")
['a1', 'a2', 'a3']
>>> getValues("CategoryB")
['b1', 'b2', 'b3']

XPath の仕事のように見えますが、私はすべての推奨事項を受け入れます。また、お気に入りの Python XML ライブラリについても教えてください。

4

7 に答える 7

7

私は Python のベテランではありませんが、libxml2 を使用した XPath ソリューションを次に示します。

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']
于 2008-09-17T21:00:32.977 に答える
7

ElementTree 1.3 (残念ながら、Python に含まれている 1.2 ではありません)は、次のような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 インターフェイスも提供します) も同じように機能します。

于 2008-09-17T21:05:38.537 に答える
4

あなたは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ツリーに似ていますが、より多くの機能が含まれています。

于 2008-09-17T20:50:51.113 に答える
4

stdlib の minidom や pxdom などの標準の W3 DOM を使用します。

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')
于 2008-09-17T21:04:42.017 に答える
4

私の好みの python xml ライブラリは、libxml2 をラップするlxmlです。
ここでは 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]
于 2008-09-17T21:12:16.507 に答える
3

Python 3.x では、属性のリストをフェッチすることは、メンバーを使用する単純なタスクです。items()

ElementTree以下のスニペットを使用して、属性のリストを取得する方法を示します。この例では名前空間が考慮されていないことに注意してください。名前空間が存在する場合は考慮する必要があります。

    import xml.etree.ElementTree as ET

    flName = 'test.xml'
    tree = ET.parse(flName)
    root = tree.getroot()
    for element in root.findall('<child-node-of-root>'):
        attrList = element.items()
        print(len(attrList), " : [", attrList, "]" )

参照:

Element.items()
要素の属性を (名前、値) ペアのシーケンスとして返します。
属性は任意の順序で返されます。

Python マニュアル

于 2016-12-29T10:56:10.170 に答える
2

その使いやすさから、私は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" )
于 2008-09-17T20:47:15.723 に答える