0

ミニドムで悩んでいます。dom 内のエントリを見つけ、そこに保持されているテキストを更新してから、ファイルを保存する必要があります。これまでのところ、特定の要素を見つけることができた唯一の方法は、非常に明示的で直接的なハードコーディングされた方法を使用することです。

doc.childNodes[0].childNodes[3].childNodes[5].childNodes[11].childNodes[1].childNodes[3] 

の最初のものを更新したいだけ<text>です<typeBox type="counter">

<typeBoxes>
    <typeBox type="counter">
        <text fontSize="140">123456</text>
        <text fontSize="26">Foobar</text>
        <incrementTextFieldNum>1</incrementTextFieldNum>
        <timing>1</timing>
        <increment>1</increment>
    </typeBox>
    <typeBox>
        <image>images/foo.png</image>
        <text fontSize="26">Foo</text>-->
    </typeBox>

    ...

提案?

4

2 に答える 2

4

minidom はそれほど強力ではありません。最近では、ほとんどの人が ElementTree のバリエーションを使用しています。Python2.5以降には組み込まれています。

>>> from xml.etree import ElementTree as etree
>>> corpus = """<typeBoxes>
...     <typeBox type="counter">
...         <text fontSize="140">123456</text>
...         <text fontSize="26">Foobar</text>
...         <incrementTextFieldNum>1</incrementTextFieldNum>
...         <timing>1</timing>
...         <increment>1</increment>
...     </typeBox>
...     <typeBox>
...         <image>images/foo.png</image>
...         <text fontSize="26">Foo</text>-->
...     </typeBox>
... </typeBoxes>"""
>>> 
>>> doc = etree.fromstring(corpus)
>>> 
>>> for typeBox in doc.findall('typeBox'):
...     if typeBox.attrib.get('type') == 'counter':
...         fieldnum = int(typeBox.find('incrementTextFieldNum').text)
...         incr = int(typeBox.find('increment').text)
...         text_field = typeBox.findall('text')[fieldnum-1]
...         text_field.text = str(int(text_field.text) + incr)
... 
>>> print etree.tostring(doc)
<typeBoxes>
    <typeBox type="counter">
        <text fontSize="140">123457</text>
        <text fontSize="26">Foobar</text>
        <incrementTextFieldNum>1</incrementTextFieldNum>
        <timing>1</timing>
        <increment>1</increment>
    </typeBox>
    <typeBox>
        <image>images/foo.png</image>
        <text fontSize="26">Foo</text>--&gt;
    </typeBox>
</typeBoxes>
>>> 
于 2011-07-22T21:46:12.690 に答える
0

childNodesリストの最初の項目を見つけたい場合は、次を使用してみてください。

typeBox_node = next((node for node in typeBoxs_node.childNodes \
                              if node.localName == 'typeBox'))

要素ごとに実行したい場合は、次を試してください。

for typeBox_node in doc.getElementsByTagName('typeBox'):
    text_node = next((node for node in typeBox_node.childNodes \
                              if node.localName == 'text'))
于 2011-07-22T21:45:34.930 に答える