2017-02-17 11 views
0

У меня есть файл XML, который содержит настройки по умолчанию для приложения с графическим интерфейсом, управления устройством:Python и XML синтаксический анализ, модифицирование, сохранение

<Settings> 
     <Setting Name="Frame0_TypeTextBox" Type="UpDown" UpDownType="d">1</Setting> 
     <Setting Name="Frame1_TypeTextBox" Type="UpDown" UpDownType="d">2</Setting> 
     <Setting Name="Frame2_TypeTextBox" Type="UpDown" UpDownType="d">1</Setting> 
     <Setting Name="messageTypeBoxManual" Type="ComboBox" UpDownType="">4</Setting> 
     <Setting Name="Frame0_C1CounterTextBox" Type="UpDown" UpDownType="Hex">0015E0</Setting> 
     <Setting Name="Frame1_C1CounterTextBox" Type="UpDown" UpDownType="Hex">0015E0</Setting> 
     <Setting Name="Frame2_C1CounterTextBox" Type="UpDown" UpDownType="Hex">0015E0</Setting> 
     <Setting Name="Frame0_CtrlMsgTextBox" Type="UpDown" UpDownType="d">2</Setting> 
     <Setting Name="Frame1_CtrlMsgTextBox" Type="UpDown" UpDownType="d">2</Setting> 
     <Setting Name="Frame2_CtrlMsgTextBox" Type="UpDown" UpDownType="d">2</Setting> 
     <Setting Name="rxSeedBox" Type="UpDown" UpDownType="Hex">03777777</Setting> 
     <Setting Name="txSeedBox" Type="UpDown" UpDownType="Hex">03777777</Setting> 
     <Setting Name="forceRxSeed" Type="CheckBox" UpDownType="">False</Setting> 
    </Settings> 

Там несколько сотен больше настроек, но все они следуют той же конвенции , этот файл генерируется приложением, о котором я упоминал, и макет должен быть сохранен, чтобы приложение прочитало его снова.

То, что я хочу сделать, это:

1) Прочитайте XML

2) Найти поля с Name = "rxSeedBox" и "txSeedBox" (Настройка имен являются уникальными)

3) Изменить их значения 03777777 к чему-то еще, например, 05FFFFFF и 08E243AF соответственно

4) Сохраните измененный XML, поэтому он может быть загружен в приложение

Вот код до сих пор:

import sys 
import os 
import time 
import xml.etree.ElementTree as ET 
from socket import * # portable socket interface plus constants 

tree = ET.parse('txg.xml') 
root = tree.getroot() 

for Setting in root.findall('Setting'): 
    Name = Setting.get('Name') 
    Type = Setting.get('Type') 
    UpDownType = Setting.get('UpDownType') 
    print(Name, Type, UpDownType, Setting.text) 

Практически все это делает в этот момент читается XML из файла и распечатать его содержимое. Я понятия не имею, чтобы найти конкретные, уникальные атрибуты имени, а затем изменить значения. Я попытался с

value = tree.findtext('Setting') 

команд, но только использование я видел до сих пор было изменить атрибуты.

Я хочу, чтобы атрибуты оставались нетронутыми, но значения между тегами, которые нужно изменить. Как это сделать с ElementTree?

+0

Я предполагаю, что в файле есть что-то еще нестандартное, поскольку этот фрагмент xml в вашем примере выглядит совершенно корректно. – Phylogenesis

+0

Хм, может быть, это обычный XML. Если вы скажете, что это действительно так, я изменю описание. В этом файле больше ничего нет, просто больше Mark

+0

В этом нет ничего нестандартного. –

ответ

0

Что вы предлагаете, кажется, работает нормально. Просто найти тот, который вы хотите изменить, и изменить его:

import sys 
import os 
import time 
import xml.etree.ElementTree as ET 

txg = """ 
    <Settings> 
     <Setting Name="Frame0_TypeTextBox" Type="UpDown" UpDownType="d">1</Setting> 
     <Setting Name="Frame1_TypeTextBox" Type="UpDown" UpDownType="d">2</Setting> 
     <Setting Name="Frame2_TypeTextBox" Type="UpDown" UpDownType="d">1</Setting> 
     <Setting Name="messageTypeBoxManual" Type="ComboBox" UpDownType="">4</Setting> 
     <Setting Name="Frame0_C1CounterTextBox" Type="UpDown" UpDownType="Hex">0015E0</Setting> 
     <Setting Name="Frame1_C1CounterTextBox" Type="UpDown" UpDownType="Hex">0015E0</Setting> 
     <Setting Name="Frame2_C1CounterTextBox" Type="UpDown" UpDownType="Hex">0015E0</Setting> 
     <Setting Name="Frame0_CtrlMsgTextBox" Type="UpDown" UpDownType="d">2</Setting> 
     <Setting Name="Frame1_CtrlMsgTextBox" Type="UpDown" UpDownType="d">2</Setting> 
     <Setting Name="Frame2_CtrlMsgTextBox" Type="UpDown" UpDownType="d">2</Setting> 
     <Setting Name="rxSeedBox" Type="UpDown" UpDownType="Hex">03777777</Setting> 
     <Setting Name="txSeedBox" Type="UpDown" UpDownType="Hex">03777777</Setting> 
     <Setting Name="forceRxSeed" Type="CheckBox" UpDownType="">False</Setting> 
    </Settings> 
""" 

tree = ET.ElementTree(ET.fromstring(txg)) 
root = tree.getroot() 

for Setting in root.findall('Setting'): 
    Name = Setting.get('Name') 
    Type = Setting.get('Type') 
    UpDownType = Setting.get('UpDownType') 
    print(Name, Type, UpDownType, Setting.text) 

print 

for Setting in root.findall('Setting'): 
    if Setting.get('Name') == 'rxSeedBox': 
     Setting.text = '05FFFFFF' 

for Setting in root.findall('Setting'): 
    Name = Setting.get('Name') 
    Type = Setting.get('Type') 
    UpDownType = Setting.get('UpDownType') 
    print(Name, Type, UpDownType, Setting.text) 

Вы получите следующий результат

('Frame0_TypeTextBox', 'UpDown', 'd', '1') 
('Frame1_TypeTextBox', 'UpDown', 'd', '2') 
('Frame2_TypeTextBox', 'UpDown', 'd', '1') 
('messageTypeBoxManual', 'ComboBox', '', '4') 
('Frame0_C1CounterTextBox', 'UpDown', 'Hex', '0015E0') 
('Frame1_C1CounterTextBox', 'UpDown', 'Hex', '0015E0') 
('Frame2_C1CounterTextBox', 'UpDown', 'Hex', '0015E0') 
('Frame0_CtrlMsgTextBox', 'UpDown', 'd', '2') 
('Frame1_CtrlMsgTextBox', 'UpDown', 'd', '2') 
('Frame2_CtrlMsgTextBox', 'UpDown', 'd', '2') 
('rxSeedBox', 'UpDown', 'Hex', '03777777') 
('txSeedBox', 'UpDown', 'Hex', '03777777') 
('forceRxSeed', 'CheckBox', '', 'False') 

('Frame0_TypeTextBox', 'UpDown', 'd', '1') 
('Frame1_TypeTextBox', 'UpDown', 'd', '2') 
('Frame2_TypeTextBox', 'UpDown', 'd', '1') 
('messageTypeBoxManual', 'ComboBox', '', '4') 
('Frame0_C1CounterTextBox', 'UpDown', 'Hex', '0015E0') 
('Frame1_C1CounterTextBox', 'UpDown', 'Hex', '0015E0') 
('Frame2_C1CounterTextBox', 'UpDown', 'Hex', '0015E0') 
('Frame0_CtrlMsgTextBox', 'UpDown', 'd', '2') 
('Frame1_CtrlMsgTextBox', 'UpDown', 'd', '2') 
('Frame2_CtrlMsgTextBox', 'UpDown', 'd', '2') 
('rxSeedBox', 'UpDown', 'Hex', '05FFFFFF') 
('txSeedBox', 'UpDown', 'Hex', '03777777') 
('forceRxSeed', 'CheckBox', '', 'False') 

Тогда это может быть, чем когда ваша печать его в формат XML вы меняете формат , Иногда это может происходить с ElementTree. Вы можете посмотреть, как напечатать это в том формате, который вы предпочитаете, например, в Pretty printing XML in Python или use xml.etree.elementtree to write out nicely formatted xml files [duplicate]

+0

Спасибо, это работает так, как я хотел. Я все еще относительно новичок в Python, поэтому не все так же очевидно, как я надеюсь, когда-нибудь это станет. – Mark