Пытаясь понять дерево элементов - PullRequest
1 голос
/ 11 ноября 2019

Я пытаюсь сделать несколько простых изменений в 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 даетмне только адрес и тело. Теоретически, поскольку ничто не равняется этому значению, оно должно дать мне точно такой же вывод, что и мой ввод (который включает дату, тип и тему).

1 Ответ

1 голос
/ 11 ноября 2019

Вы можете заметить в своем вопросе, что когда вы печатаете child.attrib, вы получаете:

{..., 'address': '51511', ...}

Таким образом, значение атрибута address является строкой "51511", а не число 51511.

Это объясняет ваши результаты.

...