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