2012-06-16 4 views
2

에서 일부 값을 가진 태그를 찾는 방법 : 나는이 tag2의 값을 변경해야나는 다음과 같은 구조를 갖는 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> 

합니다. 가능한 값은 딕셔너리에 저장되어있는 tag1의 값이 VAL1 인 경우

{tag2values:[newvalue1, newvalue2]} 

는, 우리는 newvalue1에 tag2로 값을 변경합니다. 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 식은 당신에게 텍스트 형제 tag1 태그 conf의 모든 하위 tag2 요소를 제공합니다 val1을 ElementTree 인스턴스로 사용하므로 텍스트 내용을 쉽게 바꿀 수 있습니다.

+0

이 방법으로 요소를 찾는 방법이 있는지 알고 싶습니다 : 'tag1 = "val1"/ tag2' 그것은 부모에 따라 tag2 중 하나만 우연히 필요로 할 때 상황이 될 수 있기 때문입니다 태그 값 – annndrey

+0

답변을 업데이트했습니다. 이제 XPath 질문 (예 : http://stackoverflow.com/questions/912194/matching-a-node-based-on-a-siblings-value-with-xpath)을 묻습니다. –

관련 문제