Форум: "Начинающим";
Текущий архив: 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