<p>下面是一个简单的例子,说明如何使用<code>lxml.etree</code>和<code>xpath</code>来完成我认为您想要的操作。在</p>
<pre><code>from cStringIO import StringIO
from lxml import etree
xmlfile = StringIO("""
<ThisIsMyData>
<ITEM>
<Number>0</Number>
<Flag1>TRUE</Flag1>
<Flag2>FALSE</Flag2>
<Flag3>FALSE</Flag3>
<Label>RED</Label>
<Path>C:\\test\\</Path>
<file>test.png</file>
</ITEM>
<ITEM>
<Number>1</Number>
<Flag1>TRUE</Flag1>
<Flag2>FALSE</Flag2>
<Flag3>FALSE</Flag3>
<Label>Blue</Label>
<Path>c:\\test\\test2\\</Path>
<file>blue.png</file>
</ITEM>
</ThisIsMyData>
""".strip())
datafile = StringIO("""
Label;FullPath
YELLOW;C:\\test\\test.png
YELLOW;c:\\test\\test2\\blue.png
""".strip())
# Read "csv". Simple, no error checking, skip first line.
filenameToLabel = {}
for l,f in (x.strip().split(';') for x in datafile.readlines()[1:]):
filenameToLabel[f] = l
def first(seq,default=None):
"""xpath helper function"""
for item in seq:
return item
return None
doc = etree.XML(xmlfile.read())
for item in doc.xpath('//ITEM'):
item_filename = first(item.xpath('./Path/text()'),'').strip() + first(item.xpath('./file/text()'),'').strip()
label = filenameToLabel.get(item_filename)
if label is not None:
first(item.xpath('./Flag1')).text = 'TRUE'
first(item.xpath('./Flag2')).text = 'FALSE'
first(item.xpath('./Flag3')).text = 'FALSE'
first(item.xpath('./Label')).text = label
print etree.tostring(doc)
</code></pre>
<p>收益率</p>
^{pr2}$