7

xml ファイルを開いて、特定のタグから値を取得しようとしています。私はこれを何度も行ってきましたが、この特定の xml がいくつかの問題を引き起こしています。xml ファイルのセクションは次のとおりです。

<?xml version='1.0' encoding='UTF-8'?>
<package xmlns="http://apple.com/itunes/importer" version="film4.7">
  <provider>filmgroup</provider>
  <language>en-GB</language>
  <actor name="John Smith" display="Doe John"</actor>
</package>

そして、これが私のpythonコードのサンプルです:

metadata = '/Users/mylaptop/Desktop/Python/metadata.xml'
from lxml import etree
parser = etree.XMLParser(remove_blank_text=True)
open(metadata)
tree = etree.parse(metadata, parser)
root = tree.getroot()
for element in root.iter(tag='provider'):
    providerValue = tree.find('//provider')
    providerValue = providerValue.text
    print providerValue
tree.write('/Users/mylaptop/Desktop/Python/metadataDone.xml', pretty_print = True, xml_declaration = True, encoding = 'UTF-8')

これを実行すると、プロバイダー タグまたはその値が見つかりません。削除するxmlns="http://apple.com/itunes/importer"と、すべてが期待どおりに機能します。私の質問は、この名前空間にまったく興味がないので、lxml を使用して必要なタグ値を取得するにはどうすればよいですか?

4

2 に答える 2

2

私の提案は、名前空間を無視するのではなく、考慮に入れることです。django-quickbooks ライブラリでの作業のために、いくつかの関連関数 (わずかな変更を加えてコピー) を作成しました。これらの関数を使用すると、次のことができるはずです。

providers = getels(root, 'provider', ns='http://apple.com/itunes/importer')

これらの関数は次のとおりです。

def get_tag_with_ns(tag_name, ns):
    return '{%s}%s' % (ns, tag_name)

def getel(elt, tag_name, ns=None):
    """ Gets the first tag that matches the specified tag_name taking into
    account the QB namespace.

    :param ns: The namespace to use if not using the default one for
    django-quickbooks.
    :type  ns: string
    """

    res = elt.find(get_tag_with_ns(tag_name, ns=ns))
    if res is None:
        raise TagNotFound('Could not find tag by name "%s"' % tag_name)
    return res

def getels(elt, *path, **kwargs):
    """ Gets the first set of elements found at the specified path.

    Example:
        >>> xml = (
        "<root>" +
            "<item>" +
                "<id>1</id>" +
            "</item>" +
            "<item>" +
                "<id>2</id>"* +
            "</item>" +
        "</root>")
        >>> el = etree.fromstring(xml)
        >>> getels(el, 'root', 'item', ns='correct/namespace')
        [<Element item>, <Element item>]
    """

    ns = kwargs['ns']

    i=-1
    for i in range(len(path)-1):
        elt = getel(elt, path[i], ns=ns)
    tag_name = path[i+1]
    return elt.findall(get_tag_with_ns(tag_name, ns=ns))
于 2013-08-05T21:26:08.367 に答える