2

次の構造のxmlファイルがあります。

<main_tag>
   <first>
     <tag1>val1</tag1>
     <conf>
       <tag2>val2</tag2>
       <tag3>val3</tag3>
       <tag4>val4</tag4>
     </conf>
   </first>
   <second>
     <tag1>val2</tag1>
     <conf>
       <tag2>val6</tag2>
       <tag3>val7</tag3>
       <tag4>val8</tag4>
     </conf>
   </second>
</main_tag>

tag2 の値を変更する必要があります。可能な値は dict に保存されます。

{tag2values:[newvalue1, newvalue2]}

tag1 の値が val1 の場合、tag2 の値を newvalue1 に変更します。tag1 の値が val2 の場合、tag2 の値を newvalue2 に変更します。

問題は、親の値に一致する lxml 内の要素を見つける方法があるかどうかです。または、親の隣接値で要素を見つけるには?

4

1 に答える 1

5

.xpathメソッドを使用すると、XPath 1.0 式でタグを見つけることができます。

>>> from lxml import etree
>>> from cStringIO import StringIO
>>> tag2values = ['newvalue1', 'newvalue2']
>>> example = StringIO("""\
... <main_tag>
...    <first>
...      <tag1>val1</tag1>
...      <conf>
...        <tag2>val2</tag2>
...        <tag3>val3</tag3>
...        <tag4>val4</tag4>
...      </conf>
...    </first>
...    <second>
...      <tag1>val2</tag1>
...      <conf>
...        <tag2>val6</tag2>
...        <tag3>val7</tag3>
...        <tag4>val8</tag4>
...      </conf>
...    </second>
... </main_tag>
... """)
>>> tree = etree.parse(example)
>>> value1selector = '*/conf/tag2[../../tag1/text() = "val1"]'
>>> value2selector = '*/conf/tag2[../../tag1/text() = "val2"]'
>>> for elem in tree.xpath(value1selector):
...     elem.text = tag2values[0]
... 
>>> for elem in tree.xpath(value2selector):
...     elem.text = tag2values[1]
... 
>>> print(etree.tostring(tree, pretty_print=True))
<main_tag>
   <first>
     <tag1>val1</tag1>
     <conf>
       <tag2>newvalue1</tag2>
       <tag3>val3</tag3>
       <tag4>val4</tag4>
     </conf>
   </first>
   <second>
     <tag1>val2</tag1>
     <conf>
       <tag2>newvalue2</tag2>
       <tag3>val7</tag3>
       <tag4>val8</tag4>
     </conf>
   </second>
</main_tag>

上記の例では、 の XPath 式は、 の子であるvalue1selectorすべてのtag2要素と、 textconfを持つ兄弟tag1タグをval1ElementTreeElementインスタンスとして提供するため、それらのテキスト コンテンツを簡単に置き換えることができます。

于 2012-06-16T09:08:08.463 に答える