XML i am parsing:
<List>
<Item>
<Price>
<Amount>100</Amount>
<Next_Item>
<Name>Apple</Name>
</Next_Item>
<Next_Item>
<Name>Orange</Name>
</Next_Item>
</Price>
<Price>
<Amount>200</Amount>
<Next_Item>
<Name>Apple</Name>
</Next_Item>
<Next_Item>
<Name>Orange</Name>
</Next_Item>
</Price>
</Item>
</List>
In Output XML i want to add a comment above Next_Item:
<List>
<Item>
<Price>
<Amount>100</Amount>
<!--Not-Needed-->
<Next_Item>
<Name>Apple</Name>
</Next_Item>
<Next_Item>
<Name>Orange</Name>
</Next_Item>
</Price>
<Price>
<Amount>200</Amount>
<Next_Item>
<Name>Apple</Name>
</Next_Item>
<Next_Item>
<Name>Orange</Name>
</Next_Item>
</Price>
</Item>
</List>
I tried following:
doc = etree.parse('XML1')
for id in doc.xpath('//Item/Price/Next_Item/text()'):
id = etree.Comment('Not-Needed')
root = doc.getroot()
root.insert(1, comment)
Its adding comment at the top of file instead of above 'next_item' element.
As here
root.insert(1, comment) [1 is index]
so is there a way where instead of index number i can pass a variable so i can add comment to number of places . for example whenever it finds 'next_item' it has to add a comment
output i am getting is:
<List>
<!--Not-Needed--><!--Not-Needed--><!--Not-Needed--><!--Not-Needed--><!--Not-Needed--><!--Not-Needed--><!--Not-Needed--><!--Not-Needed-->
<Item>
<Price>
<Amount>100</Amount>
<Next_Item>
<Name>Apple</Name>
</Next_Item>
<Next_Item>
<Name>Orange</Name>
</Next_Item>
</Price>
<Price>
<Amount>200</Amount>
<Next_Item>
<Name>Apple</Name>
</Next_Item>
<Next_Item>
<Name>Orange</Name>
</Next_Item>
</Price>
</Item>
</List>
Grateful for your help.
Try the below (Note that no external lib is required)
import xml.etree.ElementTree as ET
xml = '''<List>
<Item>
<Price>
<Amount>100</Amount>
<Next_Item>
<Name>Apple</Name>
</Next_Item>
<Next_Item>
<Name>Orange</Name>
</Next_Item>
</Price>
<Price>
<Amount>200</Amount>
<Next_Item>
<Name>Apple</Name>
</Next_Item>
<Next_Item>
<Name>Orange</Name>
</Next_Item>
</Price>
</Item>
</List>'''
root = ET.fromstring(xml)
first_price = root.find('.//Item/Price')
first_price.insert(1, ET.Comment('Not-Needed'))
ET.dump(root)
output
<List>
<Item>
<Price>
<Amount>100</Amount>
<!--Not-Needed-->
<Next_Item>
<Name>Apple</Name>
</Next_Item>
<Next_Item>
<Name>Orange</Name>
</Next_Item>
</Price>
<Price>
<Amount>200</Amount>
<Next_Item>
<Name>Apple</Name>
</Next_Item>
<Next_Item>
<Name>Orange</Name>
</Next_Item>
</Price>
</Item>
</List>