Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.03.13;
Скачать: [xml.tar.bz2];

Вниз

сформировать 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.003 c
3-1254836260
romichshos
2009-10-06 17:37
2011.03.13
Вычисляемые поля


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


1-1248865008
pan2905
2009-07-29 14:56
2011.03.13
TXMLDocument: ошибка: "Не был произведен вызов CoInitialize"


2-1292866353
radiokarazinec
2010-12-20 20:32
2011.03.13
TImage слои само масштабировало в зависимости от количества слоёв


15-1291245214
Германн
2010-12-02 02:13
2011.03.13
Как проще всего (с минимальными затратами времени) создать





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский