Я пытаюсь сделать несколько простых изменений в XML-файле (мои текстовые сообщения), но мне трудно понять, что именно происходит и почему.
Мой xml-файл эффективно форматируется следующим образом:
<sms count="123456" backupset="123456" backupdate="12345"....>
<sms protocol="0" address="51511" date="1531363846440" type="1" subject="null" body="Welcome to Family Mobile! Your number is: ....>
<sms protocol="0" address="58038" date="1531407417581" type="1" subject="null" body="Family Mobile Important Message:...>
...
Таким образом, когда я создаю дерево:
import xml.etree.ElementTree as ET
import os
os.chdir('C:/Users/Sams PC/Desktop/')
tree = ET.parse("text_messages.xml")
root = tree.getroot()
Мой корневой тег и атрибуты будут выглядеть так:
>>>root.tag
'smses'
>>> root.attrib
{'count': '6079', 'backup_set': '1233456', 'backup_date': '12345'}>>>
И мои дочерние узлы, таким образом, были бы смс IE:
for child in root:
... print(child.tag, child.attrib)
...
sms {'protocol': '0', 'address': '51511', 'date': '1531363846440', 'type': '1', 'subject': 'null', 'body': 'Welcome to Family Mobile! Your number is: ...}
sms {'protocol': '0', 'address': '58038', 'date': '1531407417581', 'type': '1', 'subject': 'null', 'body': 'Family Mobile Important Message: ...}
Итак, с учетом сказанного выше, я хотел выбрать тексты из определенных номеров. Так что это мой подход.
for sms in root.findall('sms'):
address=sms.get('address')
if address != 51511:
root.remove(sms)
tree.write('output.xml')
Таким образом, идея в основном заключается в том, чтобы искать и получать каждое значение в адресе в строке sms, затем отфильтровать этот адрес, сказав, что значение не равно 12345, затем удалить всю строку sms (вдругими словами, сохраняйте только тексты № 12345).
Однако вместо этого мой выходной файл удаляет каждую отдельную строку смс (даже те, у которых значение адреса 12345, т.е. я получаю пустой файл взамен). Интересно, что если я изменю удаление на адрес == 12345, вместо этого мой выходной файл будет включать каждый отдельный адрес И его тело (поэтому он удаляет дату, протокол, тип и тему).
IE
if address == 51511:
root.remove(sms)
#output is:
<sms address="51511" body="Welcome to Family Mobile! Your number is:..>
На данный момент, я не знаю, почему я получаю вывод, который я получаю, и чувствую, что я неправильно понял, как работает это дерево элементов. Любая помощь будет принята с благодарностью! Спасибо!
РЕДАКТИРОВАТЬ: Просто хотел добавить одну заключительную вещь, я считаю, что проблема заключается в том, что он говорит, что нет адреса == 'значение' IE, если я делаю это:
for sms in root.findall('sms'):
address=sms.get('address')
body=sms.get('body')
if address==51511:
print(address,body)
#output is nothing. However if I do address!=51511, I get every address with its associated body as an output. Basically implying that value of address does not exist in my xml file.
Итак, предыдущая команда действительно работает, я получаю пустой файл, потому что ни одно из значений моего адреса не равно значению 51511 (я до сих пор не знаю, почему вывод == 51511 даетмне только адрес и тело. Теоретически, поскольку ничто не равняется этому значению, оно должно дать мне точно такой же вывод, что и мой ввод (который включает дату, тип и тему).