1

私は次のようなlxmlライブラリで達成しようとしています:http: //www.xml.com/pub/a/2005/01/19/amara.html

from amara import binderytools

container = binderytools.bind_file('labels.xml')
for l in container.labels.label:
    print l.name, 'of', l.address.city

しかし、私は自分の気分を濡らすのに最も苦労しました!私がやりたいのは、「X」という名前のルートノードに降りてから、「Y」という名前の2番目の子に降りて、「Z」という名前のすべての子を取得し、属性を持つよりも子だけを保持することです。 「name」を「bacon」に設定し、残りのノードごとに「W」という名前のすべての子を調べ、A、B、Cという名前のWの唯一の子を調べるフィルターに基づいてサブセットのみを保持します。次の(最適化されていない)擬似コードでそれらを処理する必要があります。

result = []
X = root(doc(parse(xml_file_name)))
Y = X[1] # Second child
Zs = Y.children()
for Z in Zs:
    if Z.name != 'bacon': continue # skip
    Ws = Z.children()
    record = []
    assert(len(Ws) == 9)
    W0 = Ws[0]
    assert(W0.A == '42')
    record.append(str(W0.A) + " " + W0.B + " " + W0.C))
    ...
    W1 = Ws[1]
    assert(W1.A == '256')
    ...
    result.append(record)

これは私が達成しようとしていることの一種です。このコードをよりクリーンにする前に、それを機能させたいと思います。

私はこのAPIで迷子になっているので、助けてください。ご不明な点がございましたら、お気軽にお問い合わせください。

4

1 に答える 1

3
import lxml.etree as le
import io

content='''\
<foo><X><Y>skip this</Y><Y><Z name="apple"><W>not here</W></Z>
<Z name="bacon"><W><A>42</A><B>b</B><C>c</C></W><W><A>256</A><B>b</B><C>c</C></W></Z>
<Z name="bacon"><W><A>42</A><B>b</B><C>c</C></W><W><A>256</A><B>b</B><C>c</C></W></Z>
</Y></X></foo>
'''
doc=le.parse(io.BytesIO(content))
# print(le.tostring(doc, pretty_print=True))
result=[]
Zs=doc.xpath('//X/Y[2]/Z[@name="bacon"]')
for Z in Zs:
    Ws=Z.xpath('W')
    record=[]
    assert(len(Ws)==2)  #<--- Change to 9        
    abc=Ws[0].xpath('descendant::text()')
    # print(abc)
    # ['42', 'b', 'c']
    assert(abc[0] == '42')
    record.append(' '.join(abc))
    abc=Ws[1].xpath('descendant::text()')    
    assert(abc[0] == '256')
    result.append(record)
print(result)
# [['42 b c'], ['42 b c']]

これは、内側のループを強化する方法かもしれませんが、保持したいレコードを推測しているだけです。

for Z in Zs:
    Ws=Z.xpath('W')
    assert(len(Ws)==2)  #<--- Change to 9
    a_vals=('42','256')
    for W,a_val in zip(Ws,a_vals):
        abc=W.xpath('descendant::text()')
        assert(abc[0] == a_val)
        result.append([' '.join(abc)])
print(result)
# [['42 b c'], ['256 b c'], ['42 b c'], ['256 b c']]
于 2010-11-23T01:22:25.017 に答える