[英]How do I insert a specific element/text at a specific location in an XML file using python?
我目前在 Python 中使用xml.etree.cElementTree
来解析 XML 文件。 我想知道是否可以从另一个文件中读取数据并将其插入 XML 文件中的特定位置。
这是我正在使用的 XML 文件:
<Data>
<Action>A</Action>
<FinalDate>2018-08-24</FinalDate>
<InitialDate>2011-08-19</InitialDate>
<DateOperation>
<DateOperationCode>Append</DateOperationCode>
<Date>2017-08-21</Date>
<Data>
在这个文件中,我想在“ 2017-08-21 ”行之后插入从另一个文件读取的日期作为文本,以便更新的 XML 文件看起来像这样:
<Data>
<Action>A</Action>
<FinalDate>2018-08-24</FinalDate>
<InitialDate>2011-08-19</InitialDate>
<DateOperation>
<DateOperationCode>Append</DateOperationCode>
<Date>2017-08-21</Date>
<Date>2017-09-21</Date> #new date
<Date>2017-10-21</Date> #new date
<Date>2017-11-21</Date> #new date
<Data>
我尝试了不同的方法来插入日期,但到目前为止都没有奏效。
在这种情况下,我建议使用 lxml 而不是 ElementTree,因为前者对 xpath 的支持更好。
此外,由于各种原因,您的 xml 文件的格式都不是很好。
因此,假设我对您的理解正确,我将执行以下操作:
from lxml import etree
#the xml in both files is fixed, as I best understand it
file1 = """<Data>
<Action>A</Action>
<FinalDate>2018-08-24</FinalDate>
<InitialDate>2011-08-19</InitialDate>
<DateOperation>
<DateOperationCode>Append</DateOperationCode>
<Date>2017-08-21</Date>
</DateOperation>
</Data>
"""
file2 ="""<Data>
<Action>A</Action>
<FinalDate>2018-08-24</FinalDate>
<InitialDate>2011-08-19</InitialDate>
<DateOperation>
<DateOperationCode>Append</DateOperationCode>
<Date>2017-08-21</Date>
<Date>2017-09-21</Date>
<Date>2017-10-21</Date>
<Date>2017-11-21</Date>
</DateOperation>
</Data>"""
doc1 = etree.XML(file1)
doc2 = etree.XML(file2)
baseline= doc1.xpath('//DateOperation/Date/text()')[0]
dest = doc1.xpath('//DateOperation')[0]
for d in doc2.xpath(f'//Date[.="{baseline}"]//following-sibling::Date'):
dest.append(d)
print(etree.tostring(doc1).decode())
Output:
<Data>
<Action>A</Action>
<FinalDate>2018-08-24</FinalDate>
<InitialDate>2011-08-19</InitialDate>
<DateOperation>
<DateOperationCode>Append</DateOperationCode>
<Date>2017-08-21</Date>
<Date>2017-09-21</Date>
<Date>2017-10-21</Date>
<Date>2017-11-21</Date>
</DateOperation>
</Data>
我注意到修改后的 file1 看起来非常像 file2。 如果在现实生活中是这样,为什么不直接使用 file2 呢?
以下作品
import xml.etree.ElementTree as ET
import pandas as pd
xml = '''<Data>
<Action>A</Action>
<FinalDate>2018-08-24</FinalDate>
<InitialDate>2011-08-19</InitialDate>
<DateOperation>
<DateOperationCode>Append</DateOperationCode>
<Date>2017-08-21</Date>
</DateOperation>
</Data>
'''
root = ET.fromstring(xml)
dates_to_add = ['2022-09-21', '2017-03-11', '2017-05-25']
date_oper_root = root.find('.//DateOperation')
for date in dates_to_add:
new_date = ET.Element("Date")
new_date.text = date
date_oper_root.append(new_date)
ET.dump(root)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.