I am new to python and XML. I need to delete UserName and all his corresponding FeatureIds from the XML file. I tried using xml.etree.ElementTree but not able to delete FeatureIds. Any help will be greatly appreciated.
Sample XML
<?xml version="1.0" encoding="utf-8"?>
<BusinessRule>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<CovRDMMetaData>
<Config>
<Type>Business Rule</Type>
<Category>Device</Category>
</Config>
<Properties>
<PropertyInfo>
<Rule>
<Name>FeatureEntitlementDetails</Name>
<Path>Rules\FeatureEntitlementDetails.xml</Path>
<Version>4.0.12</Version>
</Rule>
<Target>
<ClientName>Money Exchange Client</ClientName>
<ClientVersion>7.8.7</ClientVersion>
<DeviceType>Money AP15</DeviceType>
</Target>
</PropertyInfo>
</Properties>
</CovRDMMetaData>
<CovRDMData>
<SetFeatureRetirement>
<IsRetired>No</IsRetired>
<MessageIfRetired>Please upgrade ROLEX client to use Set Feature option</MessageIfRetired>
</SetFeatureRetirement>
<EnabledFeatureListForUsers>
<FeatureEntitlementDetail>
<UserName>[email protected]</UserName>
<FeatureList>
<FeatureDetail>
<FeatureId>0</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>1</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>2</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>3</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>4</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>5</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>6</FeatureId>
</FeatureDetail>
</FeatureList>
</FeatureEntitlementDetail>
<FeatureEntitlementDetail>
<UserName>[email protected]</UserName>
<FeatureList>
<FeatureDetail>
<FeatureId>0</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>1</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>2</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>3</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>4</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>5</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>6</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>7</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>8</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>9</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>10</FeatureId>
</FeatureDetail>
</FeatureList>
</FeatureEntitlementDetail>
<FeatureEntitlementDetail>
<UserName>[email protected]</UserName>
<FeatureList>
<FeatureDetail>
<FeatureId>0</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>1</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>2</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>3</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>4</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>5</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>6</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>7</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>8</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>9</FeatureId>
</FeatureDetail>
<FeatureDetail>
<FeatureId>10</FeatureId>
</FeatureDetail>
</FeatureList>
</FeatureEntitlementDetail>
<FeatureEntitlementDetail>
<UserName>[email protected]</UserName>
<FeatureList>
<FeatureDetail>
<FeatureId>7</FeatureId>
</FeatureDetail>
</FeatureList>
</FeatureEntitlementDetail>
</EnabledFeatureListForUsers>
</CovRDMData>
</BusinessRule>
For example I want to delete UserName raj and all his FeatureIds from 0 to 6. Thanks in advance.
CodePudding user response:
You can achieve that using beautifulsoup
. Docs
- First select the
<UserName>
with text (as Raj in this case.). - Find it's parent i.e the
<FeatureEntitlementDetail>
using the.findParent()
method. - Now deleting the
<FeatureEntitlementDetail>
will delete the entire tree of Username Raj. You can do that using.decompose()
Here is the full code.
import requests
from bs4 import BeautifulSoup
s = """<YOUR XML GOES HERE>"""
soup = BeautifulSoup(s, 'xml')
u = soup.find('UserName', text='[email protected]')
fed = u.findParent()
fed.decompose()
print(soup.prettify())
You can see that there is no <UserName>
Raj and it's related <FeatureIds>
by printing the soup
.