Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

сформировать xml-файл на основе другого


Scott Storch ©   (2010-12-21 14:04:00) 

С сервера приходят пакеты обновления, каждый содержит заголовочный файл (файл описания обновления) и diff-файлы (файлы различий)

Пример заголовочного файла:


<upd from_ver = "1" to_ver = "2">
<file name = "ws_client.exe" size = "2549" crc_32 = "C1A9F7A1" dt_name =  "ws_client.diff" dt_size = "129" dt_crc_32 = "A05F0F72" />
<file name = "ws_svr.exe" size = "2719" crc_32 = "7B17B240" dt_name = "ws_svr.diff"  dt_size = "142" dt_crc_32 = "43BDCD7B" />
<file name = "updr.exe" size = "1047" crc_32 = "781E6643" dt_name = "updr.diff"  dt_size = "71" dt_crc_32 = "D7A01C75" />
</upd>


Задача: сформировать xml-файл список описаний обновлений (результирующий), исключив из него атрибуты с описанием diff-фалов. т.е.


<upds>
<upd from_ver = "1" to_ver = "2">
 <file name = "ws_client.exe" size = "2549" crc_32 = "C1A9F7A1" />
 <file name = "ws_svr.exe" size = "2719" crc_32 = "7B17B240" />
 <file name = "updr.exe" size = "1047" crc_32 = "781E6643" />
</>
</upds>


Как грамотно сделать копирование веток с необходимыми атрибутам? Пока что думаю сделать массив имен необходимых атрибутов, дальше в цикле проверять каждый атрибут каждой ветки и принимать решение копировать/не копировать в результирующий. Что посоветуете?


RWolf   (2010-12-22 13:11:00) [1]

Такие вещи легко делаются XSL-преобразованием — это поуниверсальнее, чем разбор документа прямо в коде.


Servy   (2010-12-22 00:21:00) [2]

Ничего сложного в сей задаче нет. Хранить ли вам в программе список тех имен атрибутов, которые нужно удалять, или же тех - которые нужно оставлять - дело ваше. Разница будет, если когда-нибудь у вас появится новый атрибут, о котором вы пока не подозреваете.

А вот и готовый код, правда (должен же быть подвох?) не на Делфи, а на одном интерпретируемом языке (python):


import xml.dom.minidom

#attributes to be saved
attributesNeeded = ('name', 'size', 'crc_32')

#the xmls to test
xmls = (
"""
<upd from_ver = "1" to_ver = "2">
<file name = "ws_client.exe" size = "2549" crc_32 = "C1A9F7A1" dt_name =  "ws_client.diff" dt_size = "129" dt_crc_32 = "A05F0F72" />
<file name = "ws_svr.exe" size = "2719" crc_32 = "7B17B240" dt_name = "ws_svr.diff"  dt_size = "142" dt_crc_32 = "43BDCD7B" />
<file name = "updr.exe" size = "1047" crc_32 = "781E6643" dt_name = "updr.diff"  dt_size = "71" dt_crc_32 = "D7A01C75" />
</upd>
""", """
<upd from_ver = "2" to_ver = "3">
<file name = "bds.exe" size = "6091888" crc_32 = "DACFD149" dt_name =  "bds.diff" dt_size = "0" dt_crc_32 = "DACFD149" />
</upd>
""")

def removeAttributes(doc):
   fileTags = doc.getElementsByTagName('file')
   for fileTag in fileTags:
       for attr in fileTag.attributes.keys():
           if not (attr in attributesNeeded):
               fileTag.removeAttribute(attr)

#create the result document and "upds" tag
resultDoc = xml.dom.minidom.Document()
updsTag = resultDoc.createElement('upds')
updsTag.appendChild(resultDoc.createTextNode('\n')) # for readability
resultDoc.appendChild(updsTag)

#add all the xml with removed attributes
for x in xmls:
   #if we got filenames there, we use xml.dom.minidom.parse instead
   doc = xml.dom.minidom.parseString(x)
   removeAttributes(doc)    
   for node in doc.childNodes:
       updsTag.appendChild(node)
   updsTag.appendChild(resultDoc.createTextNode('\n')) # for readability

#print the result!
print resultDoc.toxml()


А вот и результат (форматтер посчитал нужным атрибуты в алфавитном порядке вывести, не обессудьте)


<?xml version="1.0" ?>
<upds>
<upd from_ver="1" to_ver="2">
<file crc_32="C1A9F7A1" name="ws_client.exe" size="2549"/>
<file crc_32="7B17B240" name="ws_svr.exe" size="2719"/>
<file crc_32="781E6643" name="updr.exe" size="1047"/>
</upd>
<upd from_ver="2" to_ver="3">
<file crc_32="DACFD149" name="bds.exe" size="6091888"/>
</upd>
</upds>


На Делфи аналог будет чутка длиннее, ибо переменные придется пообъявлять, а в остальном примерно то же. Успешного написания ^_^.


KilkennyCat   (2010-12-21 14:37:00) [3]

Согласен с Плохишом. В жопу это программирование - ночи не спишь, счастья нет, и все равно умрем.


Scott Storch   (2010-12-21 14:29:00) [4]


> PS. зачем оно вам, это программирование?


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


Плохиш   (2010-12-21 14:17:00) [5]

1. загрузить файл в txmldocument
2. удалить ненужные аттрибуты
3. сохранить результат

PS. зачем оно вам, это программирование?


Наверх

Титульная страница Поиск, карта сайта Написать письмо