![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание xml файла в делфи [D7]
vgvolk © (2011-09-28 08:49:00)Приветсвую мастера.Мне нужно создать шапку xml файла(по щелчку по кнопке) такого типа
<?xml version="1.0" encoding="UTF-8" ?>
- <package subdivision="420-056" name="" date="20110906">
</package>
где значения package subdivision он берет из раскрывающегося списка на форме.Name из эдита.А date ставит текущую.
После этого мановением руки по другой кнопке он добавляет строку
<pasport page="1" seria="3206" number="124954" foto="3206124954.jpg" form="3206124954.tif" />
Pasport page изменяется значение 1,3,5,7,9.
seria берет из эдита.
number тоже из эдита.
foto seria + number+.jpg.
form seria + number+.tif.
И сохраняет файл под именем 420-056_20110906.1p
Вот вид уже готового файла
<?xml version="1.0" encoding="UTF-8" ?>
- <package subdivision="420-056" name="" date="20110906">
<pasport page="1" seria="3206" number="124954" foto="3206124954.jpg" form="3206124954.tif" />
<pasport page="3" seria="3209" number="756278" foto="3209756278.jpg" form="3209756278.tif" />
<pasport page="5" seria="3208" number="635975" foto="3208635975.jpg" form="3208635975.tif" />
<pasport page="7" seria="3205" number="996229" foto="3205996229.jpg" form="3205996229.tif" />
<pasport page="9" seria="3202" number="941355" foto="3202941355.jpg" form="3202941355.tif" />
<pasport page="11" seria="3207" number="402678" foto="3207402678.jpg" form="3207402678.tif" />
<pasport page="13" seria="3201" number="306669" foto="3201306669.jpg" form="3201306669.tif" />
<pasport page="15" seria="3204" number="722477" foto="3204722477.jpg" form="3204722477.tif" />
<pasport page="17" seria="3209" number="794054" foto="3209794054.jpg" form="3209794054.tif" />
<pasport page="19" seria="3204" number="554152" foto="3204554152.jpg" form="3204554152.tif" />
</package>
Как это сделать,и с чего начать?
Servy (2011-09-29 19:30:00) [61]
> [20]
Ваш код плохо отформатирован и очень печален по своей сути. Я бы посоветовал вам ознакомиться с литературой по Делфи, прежде чем приступать к решению данной задачи (о чем вам уже намекали в [11] и [21]).
По поводу собственно задачи уже было сказано в [13]
> видно что и впрямь без TXMLDocument не обойтись.
Вам нужна библиотека для работы с xml. Формирование xml ручками занятие весьма неблагодарное и бесполезное, лучше уж книжки по Делфи читать вместо этого.
TXmlDocument несколько тяжеловат и не всегда интуитивен в использовании, зато про него немало написано в интернетах, ищущий найдет примеры использования без проблем.
Я бы для подобной задачи вместо TXmlDocument воспользовался модулем JclSimpleXml из джедайской библиотеки. Создание xml могло бы выглядеть как-нибудь так:
var
Xml: TJclSimpleXML;
XmlElement: TJclSimpleXMLElemClassic;
begin
Xml := TJclSimpleXML.Create;
try
Xml.Prolog.Version := '1.0';
Xml.Prolog.Encoding := 'utf-8';
// корневой элемент
Xml.Root.Name := 'package ';
Xml.Root.Properties.Add('subdivision', '010-008');
Xml.Root.Properties.Add('name', ''); // кстати, непонятно нафига вам пустой атрибут name
Xml.Root.Properties.Add('date', '20110929');
// создание элемента
XmlElement := Xml.Root.Items.Add('pasport');
// используя XmlElement.Properties добавляете ему все нужные атрибуты
Xml.SaveToFile('C:\Temp\SomeFileName.xml'); // и да, абсолютные пути в исходнике - зло, тут только в демонстрационных целях и все такое
finally
Xml.Free;
end;
end;
vgvolk (2011-09-29 19:25:00) [62]Это вы ректально на свет появились.А код рабочий.
Dennis I. Komarov (2011-09-29 19:18:00) [63]Ректально...
vgvolk (2011-09-29 18:47:00) [64]
procedure TForm1.btn3Click(Sender: TObject);{Создание шапки xml}
var fil: TextFile;
s:string;
begin
begin
AssignFile(fil,'C:\Folder\'+cbb1.Text+'.txt');{cbb1-это комбобокс где пользователь выбирает код подразделения}
if FileExists('C:\Folder\'+cbb1.Text+'.txt') then
Append(fil) else rewrite(fil);
Writeln(fil,'<?xml version="1.0" encoding="UTF-8"?><package subdivision="'+cbb1.text+'" name="" date="'+formatdatetime('yyyymmdd',Date())+'">');
CloseFile(fil);
end;
Результат 1-го блока
<?xml version="1.0" encoding="UTF-8"?><package subdivision="010-008" name="" date="20110929">
Это создание шапки как видно я не закрываю его потому что мне нужно добавить дочерних узлов с данными,поэтому этот файл еще не полноценный xml файл
............
begin{Создание "тела" файла}
AssignFile(fil,'C:\Folder\'+cbb1.Text+'.txt');
if FileExists('C:\Folder\'+cbb1.Text+'.txt') then
Append(fil) else ShowMessage('Файл отсутсвует!');
Write(fil,'<pasport page="1" seria="'+edt1.text+'" number="'+edt2.text+'" foto="'+edt1.text+edt2.text+'.jpg" form="'+edt1.Text+edt2.Text+'.tif"/>');
CloseFile(fil);
end;
Результат 1+2 блок на примере добавления двух записей
<?xml version="1.0" encoding="UTF-8"?><package subdivision="010-008" name="" date="20110929">
<pasport page="1" seria="3208" number="1234" foto="32081234.jpg" form="32081234.tif"/><pasport page="1" seria="3209" number="7849" foto="32097849.jpg" form="32097849.tif"/><pasport page="1" seria="3256" number="46755" foto="325646755.jpg" form="325646755.tif"/>
............
AssignFile(fil,'C:\Folder\'+cbb1.Text+'.txt');
if FileExists('C:\Folder\'+cbb1.Text+'.txt') then
Append(fil) else ShowMessage('Файл отсутсвует!');
Write(fil,'</package>');
CloseFile(fil);
Form1.Close;
RenameFile('C:\folder\'+cbb1.Text+'.txt','C:\folder\'+cbb1.Text+'_'+formatdatetime('yyyymmdd',Date())+'.1p');{Изменяет имя файла на код+дата+новое расширение}
Результат взаимодействия всех блоков
<<?xml version="1.0" encoding="UTF-8"?><package subdivision="010-008" name="" date="20110929">
<pasport page="1" seria="3208" number="1234" foto="32081234.jpg" form="32081234.tif"/><pasport page="1" seria="3209" number="7849" foto="32097849.jpg" form="32097849.tif"/><pasport page="1" seria="3256" number="46755" foto="325646755.jpg" form="325646755.tif"/></package>
Как видно добавилось только завершение файла </package>
Вот такой у меня код.Ну это только часть создания xml файла.Остальная делает совсем другие вещи.
Медвежонок Пятачок (2011-09-29 16:05:00) [65]у них сегодня выходной
QAZ (2011-09-29 15:42:00) [66]
> их всего два : repeat и while. выбор небольшой.
а ещо 2 куда делись :)
stas (2011-09-29 14:44:00) [67]vgvolk (29.09.11 14:05) [14]
А как ты формируешь файл? покажи код
Медвежонок Пятачок (2011-09-29 14:32:00) [68]Как то нужно создать цикл
циклы создаются операторами языка
но какой цикл можно создать для строки?
их всего два : repeat и while. выбор небольшой.
Медвежонок Пятачок (2011-09-29 14:27:00) [69]Как видно страницу паспорта он пишет всегда 1
Пишет не "он", а ты.
нужно что бы при новом открытии он проверял последнюю строку
Снова не "он", а ты проверяй.
"Его" просто нет. Есть только ты.
vgvolk (2011-09-29 14:05:00) [70]Спасибо за помощь.У меня еще вопросик Я сделал он создает файл правильно только есть одно но
<?xml version="1.0" encoding="UTF-8" ?>
- <package subdivision="420-056" name="" date="20110906">
<pasport page="1" seria="3206" number="124954" foto="3206124954.jpg" form="3206124954.tif" />
<pasport page="1" seria="3209" number="756278" foto="3209756278.jpg" form="3209756278.tif" />
<pasport page="1" seria="3208" number="635975" foto="3208635975.jpg" form="3208635975.tif" />
<pasport page="1" seria="3205" number="996229" foto="3205996229.jpg" form="3205996229.tif" /> </package>
Как видно страницу паспорта он пишет всегда 1 нужно что бы при новом открытии он проверял последнюю строку pasport page="1" текстового файла и новую изменял на 3.Следующую сделал бы 5 и т.д.Как то нужно создать цикл но какой цикл можно создать для строки?
Cobalt (2011-09-29 13:23:00) [71]vgvolk
ОК, видно что и впрямь без TXMLDocument не обойтись.
Гугл тебе в помощь за примерами как работать с этим зверем, благо статей немало написано.
stas (2011-09-29 13:06:00) [72]vgvolk (29.09.11 12:32) [10]
Будут проблемы с кодировкой если присутствуют допустим русские буквы.
преобразовать строку можно по моему функцией UTF8ToString
Dennis I. Komarov (2011-09-29 12:58:00) [73]
> Когда добавляю в строку writeln date он пишет Несовместимость
> типов String and TDateTime.
Рано Вам еще про XML думать...
vgvolk (2011-09-29 12:32:00) [74]Я меняю расширение .xml и открываю в браузере IE.Открывает и нормально читает.Зачем сохранить в формате UTF-8?И как если это необходимо.
stas (2011-09-29 12:22:00) [75]1. Строку еще нужно сохранить в формате UTF-8 !
2. formatDateTime('yyyymmdd',date())
3. TXMLDocument либо Парсинг xml самостоятельно.
vgvolk (2011-09-29 11:32:00) [76]Преобразовал я всё в строку работает)
Только не знаю как текущую дату в строку добавить(date="20110906")
Когда добавляю в строку writeln date он пишет Несовместимость типов String and TDateTime.
И еще не могу понять У меня есть файл codes.xml там содержатся коды подразделений мне нужно чтобы пользователь из Combobox мог выбрать эти коды.Как загрузить в items комбобокса атрибуты этого файла?Только не предлагать вариант вписать вручную так как их там больше 300 и они могут изменятся.
Сергей М. (2011-09-28 13:42:00) [77]
> vgvolk (28.09.11 12:58) [6]
>
> Попробую
Обязательно начни пробовать с правой руки. Если конечно не левша.
vgvolk (2011-09-28 12:58:00) [78]Попробую как будут результаты отпишусь
QAZ (2011-09-28 12:04:00) [79]
> stas © (28.09.11 10:40) [3]
+100500
Cobalt (2011-09-28 11:51:00) [80]> stas © (28.09.11 10:40) [3]
> ну, или сформируй как строку.
Яростно плюсую.