代码之家  ›  专栏  ›  技术社区  ›  roomaroo

获取python中XML属性值的列表

  •  13
  • roomaroo  · 技术社区  · 16 年前

    我需要从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的工作,但我对所有建议都持开放态度。我还想听听您最喜欢的PythonXML库。

    7 回复  |  直到 16 年前
        1
  •  7
  •   community wiki 3 revs Jesse Millikan    16 年前

    我对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']
    
        2
  •  6
  •   dF.    16 年前

    ElementTree 1.3 (不幸的是,不是1.2,它是包含在Python中的那个) supports 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 (它还提供元素树接口)也将以同样的方式工作。

        3
  •  3
  •   Eli Courtwright    16 年前

    使用标准W3 DOM,如stdlib的minidom或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')
    
        4
  •  2
  •   pjz    16 年前

    我必须承认我是 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" )
    
        5
  •  2
  •   Cristian    16 年前

    你可以用 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,我建议您看一下漂亮的汤。它类似于DOM树,但包含更多功能。

        6
  •  2
  •   Brian    16 年前

    我的首选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]
    
        7
  •  0
  •   Ramakant    8 年前

    在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, "]" )
    

    参考文献:

    元素,项()
    以(名称、值)对的顺序返回元素属性。
    属性以任意顺序返回。

    Python manual