Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.03.13;
Скачать: CL | DM;

Вниз

сформировать xml-файл на основе другого   Найти похожие ветки 

 
Scott Storch   (2010-12-21 14:04) [0]

С сервера приходят пакеты обновления, каждый содержит заголовочный файл (файл описания обновления) и 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>


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


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

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

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


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


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


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


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

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


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

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

А вот и готовый код, правда (должен же быть подвох?) не на Делфи, а на одном интерпретируемом языке (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>


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


 
RWolf ©   (2010-12-22 13:11) [5]

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



Страницы: 1 вся ветка

Текущий архив: 2011.03.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.008 c
2-1292680185
фуфик
2010-12-18 16:49
2011.03.13
Не могу определить цвет пикселя


2-1293027231
RUu
2010-12-22 17:13
2011.03.13
поле не может содержать значение null


15-1290979780
Юрий
2010-11-29 00:29
2011.03.13
С днем рождения ! 29 ноября 2010 понедельник


15-1291066179
Юрий
2010-11-30 00:29
2011.03.13
С днем рождения ! 30 ноября 2010 вторник


4-1246385316
deplomat
2009-06-30 22:08
2011.03.13
Проблемы с выводом битмапа (выводяться, а потом перестают)