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

Вниз

Создание xml файла в делфи   Найти похожие ветки 

 
vgvolk   (2011-09-28 08:49) [0]

Приветсвую мастера.Мне нужно создать шапку 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>

Как это сделать,и с чего начать?


 
Медвежонок Пятачок ©   (2011-09-28 09:28) [1]

По моему, начать надо с тренировки руки. Правой.
Ибо в задании "... мановением руки по другой кнопке..."

PS Как натренируешь руку, начинай читать хелп по TXMLDocument.


 
RWolf ©   (2011-09-28 09:29) [2]

с гугления по ключевому слову TXMLDocument.


 
stas ©   (2011-09-28 10:40) [3]

ну, или сформируй как строку.


 
Cobalt ©   (2011-09-28 11:51) [4]

> stas ©   (28.09.11 10:40) [3]
> ну, или сформируй как строку.


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


 
QAZ   (2011-09-28 12:04) [5]


> stas ©   (28.09.11 10:40) [3]

+100500


 
vgvolk   (2011-09-28 12:58) [6]

Попробую как будут результаты отпишусь


 
Сергей М. ©   (2011-09-28 13:42) [7]


> vgvolk   (28.09.11 12:58) [6]
>
> Попробую


Обязательно начни пробовать с правой руки. Если конечно не левша.


 
vgvolk   (2011-09-29 11:32) [8]

Преобразовал я всё  в строку работает)
Только не знаю как текущую дату в строку добавить(date="20110906")
Когда добавляю в строку writeln date он пишет Несовместимость типов String and TDateTime.
И еще не могу понять У меня есть файл codes.xml там содержатся коды подразделений мне нужно чтобы пользователь из Combobox мог выбрать эти коды.Как загрузить в items комбобокса атрибуты этого файла?Только не предлагать вариант вписать вручную так как их там больше 300 и они могут изменятся.


 
stas ©   (2011-09-29 12:22) [9]

1. Строку еще нужно сохранить в формате UTF-8 !
2. formatDateTime("yyyymmdd",date())
3. TXMLDocument либо Парсинг xml самостоятельно.


 
vgvolk   (2011-09-29 12:32) [10]

Я меняю расширение .xml и открываю  в браузере IE.Открывает и нормально читает.Зачем сохранить в формате UTF-8?И как если это необходимо.


 
Dennis I. Komarov ©   (2011-09-29 12:58) [11]


> Когда добавляю в строку writeln date он пишет Несовместимость
> типов String and TDateTime.

Рано Вам еще про XML думать...


 
stas ©   (2011-09-29 13:06) [12]

vgvolk   (29.09.11 12:32) [10]
Будут проблемы с кодировкой если присутствуют допустим русские буквы.
преобразовать строку можно по моему функцией UTF8ToString


 
Cobalt ©   (2011-09-29 13:23) [13]

vgvolk
ОК, видно что и впрямь без TXMLDocument не обойтись.
Гугл тебе в помощь за примерами как работать с этим зверем, благо статей немало написано.


 
vgvolk   (2011-09-29 14:05) [14]

Спасибо за помощь.У меня еще вопросик Я сделал он создает файл правильно только есть одно но
<?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 и т.д.Как то нужно создать цикл но какой цикл можно создать для строки?


 
Медвежонок Пятачок ©   (2011-09-29 14:27) [15]

Как видно страницу паспорта он пишет всегда 1

Пишет не "он", а ты.

нужно что бы при новом открытии он проверял последнюю строку

Снова не "он", а ты проверяй.

"Его" просто нет. Есть только ты.


 
Медвежонок Пятачок ©   (2011-09-29 14:32) [16]

Как то нужно создать цикл
циклы создаются операторами языка

но какой цикл можно создать для строки?
их всего два : repeat и while. выбор небольшой.


 
stas ©   (2011-09-29 14:44) [17]

vgvolk   (29.09.11 14:05) [14]
А как ты формируешь файл? покажи код


 
QAZ   (2011-09-29 15:42) [18]


> их всего два : repeat и while. выбор небольшой.

а ещо 2 куда делись :)


 
Медвежонок Пятачок ©   (2011-09-29 16:05) [19]

у них сегодня выходной


 
vgvolk   (2011-09-29 18:47) [20]


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 файла.Остальная делает совсем другие вещи.


 
Dennis I. Komarov ©   (2011-09-29 19:18) [21]

Ректально...


 
vgvolk   (2011-09-29 19:25) [22]

Это вы ректально на свет появились.А код рабочий.


 
Servy ©   (2011-09-29 19:30) [23]


> [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:38) [24]

Спасибо,сейчас или завтра утром попробую использовать эту библиотеку.И кстати вопрос что мне изменить в коде чтобы он строку преобразовал в utf-8?


 
Servy ©   (2011-09-29 19:50) [25]

Я бы ваш код переписал изначально, ибо без слез его читать невозможно.

В целом же, преобразовать строку в UTF8 просто - нужно воспользоваться функцией UTF8Encode.


 
Dennis I. Komarov ©   (2011-09-29 19:59) [26]


> ибо без слез его читать невозможно.

Зато рабочий :)


 
stas ©   (2011-09-29 20:25) [27]

vgvolk   (29.09.11 18:47) [20]
2-й блок добавляет только 1 строчку в xml, а как появляются такие же остальные?


 
vgvolk   (2011-09-29 20:55) [28]

А мне как раз нужно чтобы строчки добавлялись не все разом.Я ввожу в эдитах серию,номер и нажимаю кнопку в которой прописан второй блок он добавляет нужную мне строчку.Потом я автоматом очищаю эдиты опять ввожу данные и добавляю еще строку.Когда я добавил все что хотел я закрываю файл третьим блоком.Первые два блока у меня записаны на отдельных кнопках а третий блок записан в событии Onclick компонета CheckBox.


 
Медвежонок Пятачок ©   (2011-09-29 21:06) [29]

устаешь наверное под вечер-то.


 
stas ©   (2011-09-29 21:57) [30]

vgvolk   (29.09.11 20:55) [28]
Так веди счетчик нажатий и подставляй его вместо page="1"

например

TForm1 = Class (Tform)
private
FClicks:Integer;
....
//на нажатие кнопки
FClicks:=FClicks+1;

//При формировании
Write(fil,"<pasport page=""+IntToStr(FClicks)+"" seria=""+edt1.text+"" number=""+edt2.text+"" foto=""+edt1.text+edt2.text+".jpg" form=""+edt1.Text+edt2.Text+".tif"/>");


 
stas ©   (2011-09-29 21:58) [31]

Только не забудь его сбрасывать в 0


 
Dennis I. Komarov ©   (2011-09-29 23:16) [32]


> stas ©

Ох, плохому ведь научишь...


 
vgvolk   (2011-09-30 07:59) [33]

Спасибо большое,все работает теперь.


 
vgvolk   (2011-09-30 08:31) [34]

У меня еще проблемка

var fil: TextFile;
   s:string;
begin
begin
fullFileName:="C:\Folder\"
AssignFile(fil,ExtractFilePath(fullFileName)+cbb1.Text+".txt");{cbb1-это комбобокс где пользователь выбирает код подразделения}
if FileExists(ExtractFilePath(fullFileName)+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;

Мне нужно чтобы он кидал файлы не в C:\Folder\ а в C:\Folder\текущая дата
Т.е. создавать папку с именем текущей даты.Не знаю как вставить formatdatetime("yyyymmdd",Date()) в путь папки.Это вообще реально?


 
Dennis I. Komarov ©   (2011-09-30 09:19) [35]


> Мне нужно чтобы он кидал файлы не в C:\Folder\ а в C:\Folder\текущая
> дата

Еще одно гениальное решение... Нету у юзверей прав писать на C: (C:\Folder) и это правильно. И нефига писать проги, подразумевая что все ходят с админ-правами...


> Т.е. создавать папку с именем текущей даты.Не знаю как вставить
> formatdatetime("yyyymmdd",Date()) в путь папки.Это вообще
> реально?
>

Разумеется реально, DateToStr + F1


 
vgvolk   (2011-09-30 10:03) [36]

var fil: TextFile;
   s:string;
begin
begin
fullFileName:="C:\Folder\"+ DateToStr(Date){Добавляем дату}
AssignFile(fil,ExtractFilePath(fullFileName)+cbb1.Text+".txt");
if FileExists(ExtractFilePath(fullFileName)+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;

Добавляю дату но это ничего не меняет я ее в разные места вставлял
fullFileName:="C:\Folder\+ DateToStr(Date)"{Добавляем дату}
fullFileName:="C:\Folder\DateToStr(Date)"{Добавляем дату}

Папку не создает


 
Dennis I. Komarov ©   (2011-09-30 10:06) [37]


> Папку не создает

И не должен...


 
Медвежонок Пятачок ©   (2011-09-30 10:26) [38]

Мне нужно чтобы он кидал файлы не в C:\Folder\

Ты ему-то и скажи, чтобы он кидал куда надо.


 
vgvolk   (2011-09-30 10:38) [39]

Каким образом?


 
Медвежонок Пятачок ©   (2011-09-30 10:40) [40]

сначала вежливо, а если не поймет, скажи, что позовешь местных и они ему наваляют.

кстати, открой секрет, кто такой "он"?



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

Форум: "Начинающим";
Текущий архив: 2012.01.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.004 c
15-1317414603
Юрий
2011-10-01 00:30
2012.01.15
С днем рождения ! 1 октября 2011 суббота


15-1316982602
Юрий
2011-09-26 00:30
2012.01.15
С днем рождения ! 26 сентября 2011 понедельник


15-1317069002
Юрий
2011-09-27 00:30
2012.01.15
С днем рождения ! 27 сентября 2011 вторник


3-1269596428
Kley
2010-03-26 12:40
2012.01.15
как правильно организовать вставку записей


9-1175164239
crytogen
2007-03-29 14:30
2012.01.15
нарисовать трубу в OpenGL по точкам





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский