繁体   English   中英

如何使用 python 在 XML 文件的特定位置插入特定元素/文本?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM