2012-06-16 41 views
2

一定的价值标签我有以下结构的XML文件:如何找到与Python和LXML

<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的价值。可能的值存储在一个字典:

{tag2values:[newvalue1, newvalue2]} 

如果标记1的值是VAL1,那么我们TAG2值更改为newvalue1。如果tag1值为val2,那么我们将tag2值更改为newvalue2。

所以问题是:有没有办法在lxml中找到一个匹配其父值的元素? 或者通过它的父亲值找到一个元素?

回答

4

.xpath method让我们找到与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> 

在上面的例子中,value1selector XPath表达式给你,是conf孩子们都tag2元素,与兄弟姐妹tag1标签文本val1,作为ElementTree Element实例,因此使得替换它们的文本内容变得微不足道。

+0

我想知道是否有这种方式来查找元素:'tag1 =“val1”/ tag2',因为它可能是一种情况,当我们只需要一个tag2取决于它的父母标签值 – annndrey

+0

更新了答案;请注意,您现在基本上要求XPath问题,例如http://stackoverflow.com/questions/912194/matching-a-node-based-on-a-siblings-value-with-xpath –