0

我有一个非常小的 XML 文件(22 行),其中包含 5 个元素(?),我只想要一个值。

这是我在不使用正则表达式的情况下获得我找到的值的唯一方法

from xml.dom.minidom import parse
float(parse(filePath).getElementsByTagName('InfoType')[0].getElementsByTagName('SpecificInfo')[0].firstChild.data)

我觉得我错过了什么。必须有一种更 Pythonic 的方式来处理 XML,对吗?

4

4 回答 4

11

ElementTree库比 xml.dom.minidom 更像 Pythonic。如果我正确理解您的 XML 结构,您的代码使用 ElementTree 将如下所示:

import xml.etree.ElementTree as ET
tree = ET.parse(filePath)
data = float(tree.find('InfoType/SpecificInfo')[0].text)

这应该比你目前正在做的要干净得多。

于 2013-08-19T03:52:05.683 回答
2

除了那些冗长的 DOM 浏览功能,您至少可以使用 pyQuery:http ://pythonhosted.org/pyquery/ (Python 中的 jQuery 语法)

于 2013-08-19T03:35:04.110 回答
1

使用 elementtree 是从 XML 获取单个值的更 Pythonic 方式:

http://docs.python.org/2/library/xml.etree.elementtree.html

它是最新 Python 版本的标准库的一部分。

于 2013-08-19T03:50:36.963 回答
0

我认为现在将 minidom API 视为 unpythonic 还为时过早。通过几个辅助函数,我们可以得到我们希望的 Pythonic,例如:

# Helper function to wrap the DOM element/attribute creation API.
def El( tag, attribs = None, text = None ):
    el = doc.createElement( tag )
    if text: el.appendChild( doc.createTextNode( text ))
    if attribs is None: return el
    for k, v in attribs.iteritems(): el.setAttribute( k, v )
    return el

# Construct an element tree from the passed tree.
def make_els( parent_el, this_el, child_els ):
    parent_el.appendChild( this_el )
    for x in child_els:
        if type( x ) is tuple:
            child_el, grandchild_els = x
            make_els( this_el, child_el, grandchild_els )
        else:
            this_el.appendChild( x )

doc.removeChild( doc.documentElement )
make_els( doc, El( 'html', { 'xmlns': 'http://www.w3.org/1999/xhtml', 'dir': 'ltr', 'lang': 'en' }), [
    (   El( 'head' ), [
        El( 'meta', { 'http-equiv': 'Content-Type', 'content': 'text/html; charset=utf-8' }),
        El( 'meta', { 'http-equiv': 'Content-Style-Type', 'content': 'text/css' }),
        El( 'link', { 'rel': 'stylesheet', 'type': 'text/css', 'href': 'main.css', 'title': 'Default Stylesheet' }),
        El( 'title', {}, 'XXXX XXXX XXXXr {}, {}'.format( args.xxxx, env.build_time ))
    ]),
    (   El( 'frameset', { 'cols': '20%, 80%' }), [
        El( 'frame', { 'src': 'xxx_list.html', 'name': 'listframe', 'title': 'XXXX XXXX XXXX' }),
        El( 'frame', { 'src': 'xxx_all_xxxx_all.html', 'name': 'regframe', 'title': 'XXX XXXX XXXX' }),
        (   El( 'noframes' ), [
            (   El( 'body' ), [
                El( 'h2', {}, 'Frame Alert' ),
                El( 'p', {}, 'This document is designed to be viewed using the frames feature.' )
            ])
        ])
    ])
])
print '\ndoc:\n', doc.toprettyxml( indent = '  ' )
于 2014-09-05T10:31:12.163 回答