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

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

Создание xml файла в делфи [D7]


Страницы:   1 2 3 4 5

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]
> ну, или сформируй как строку.


Яростно плюсую.


Страницы:   1 2 3 4 5

Наверх

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