Форум: "Начинающим";
Текущий архив: 2012.01.22;
Скачать: [xml.tar.bz2];
ВнизВыгрузка данных из TDataSet в XML Найти похожие ветки
← →
alexis (2011-09-21 11:29) [0]Такой код:
with XMLDocument1 do
begin
DocumentElement:=AddChild("main");
end;
XmlRoot:=XMLDocument1.ChildNodes["main"];
with XmlRoot do
begin
AddChild("Kod_OIV");
ChildValues["Kod_OIV"]:=OIVDs.FieldByName("ID").AsString;
AddChild("NAIM_OIV");
ChildValues["NAIM_OIV"]:=OIVDs.FieldByName("NAIM").AsString;
TaskNode:=XmlRoot.AddChild("Task");
with TaskNode do
begin
while not TaskDS.Eof do
begin
AddChild("Kod_Task");
AddChild("NAIM_Task");
ChildValues["Kod_Task"]:=TaskDs.FieldByName("ID").AsString;
ChildValues["NAIM_Task"]:=TaskDs.FieldByName("NAIM").AsString;
TaskDS.Next;
end;
end;
end ;
В файле получаю:<?xml version="1.0" encoding="UNICODE"?>
-<main><Kod_OIV>3</Kod_OIV><NAIM_OIV>хххххх хххххх</NAIM_OIV>-<Task><Kod_Task>10</Kod_Task><NAIM_Task>ххххх хххххх</NAIM_Task><Kod_Task/><NAIM_Task/><Kod_Task/><NAIM_Task/><Kod_Task/><NAIM_Task/></Task></main>
Почему данные из датасет выгружаются только в первый элемент TaskNode?
← →
Ega23 © (2011-09-21 11:53) [1]
> Почему данные из датасет выгружаются только в первый элемент
> TaskNode?
Дык так по коду и должно быть.
если ты хочешь структуру вида
<Tasks>
<Task>
<Kod_Task>...
<Name_Task> ...
</Task>
<Task>
<Kod_Task>...
<Name_Task> ...
</Task>
</Tasks>
то так и надо делать.
← →
alexis (2011-09-21 11:58) [2]Хочу такую:
<Task>
<Kod_Task>...
<Name_Task> ...
<Kod_Task>...
<Name_Task> ...
</Task>
Или это не правильно?
Файл xml нужен для того, чтобы в небольшой программке пользователи могли поправить данные непосредственно в xml файле (предполагаю TClientDataset использовать), а затем правленные данные снова загрузить в базу.
← →
Ega23 © (2011-09-21 12:01) [3]т.е.
var
aRootNode, aCurrNode, aRootTaskNode: IXMLNode;
begin
aRootNode := ....
aCurrNode := aRootNode.AddChild("Kod_OIV");
aCurrNode.ChildValues["Kod_OIV"]:=OIVDs.FieldByName("ID").AsString;
aCurrNode := aRootNode.AddChild("NAIM_OIV");
aCurrNode.ChildValues["NAIM_OIV"]:=OIVDs.FieldByName("NAIM").AsString;
aRootTaskNode := aRootNode.AddChild("Task");
with TaskDS do
while not Eof do
begin
aCurrNode := aRootTaskNode.AddChild("Task");
aCurrNode.AddChild("Kod_Task");
aCurrNode.AddChild("NAIM_Task");
aCurrNode.ChildValues["Kod_Task"] := FieldByName("ID").AsString;
aCurrNode.ChildValues["NAIM_Task"] := FieldByName("NAIM").AsString;
Next;
end;
end;
как-то так.
З.Ы. писал прямо тут, не проверял.
← →
Ega23 © (2011-09-21 12:02) [4]
> Или это не правильно?
Это ненаказуемо, но задолбаешься потом обходить эту структуру.
← →
Ega23 © (2011-09-21 12:03) [5]З.Ы. Я бы всё это дело (ID и Name) в атрибуты самого нода Task пихал.
← →
Плохиш © (2011-09-21 12:09) [6]
> Хочу такую:
> <Task>
> <Kod_Task>...
> <Name_Task> ...
> <Kod_Task>...
> <Name_Task> ...
> </Task>
И как ты собираешься соответствия между своими парами контролировать?
← →
alexis (2011-09-21 12:13) [7]
> Плохиш © (21.09.11 12:09) [6]
> И как ты собираешься соответствия между своими парами контролировать?
Об этом я еще не думал. Первый раз выгрузку делаю в xml.
← →
Медвежонок Пятачок © (2011-09-21 12:14) [8]наш человек.
сначала прыгает, потом думает, взял ли парашют.
← →
alexis (2011-09-21 12:21) [9]
> Ega23 © (21.09.11 12:01) [3]
Код работает один в один как и мой, т.е. выдает только одну последнюю запись из датасета.
> Ega23 © (21.09.11 12:03) [5]
З.Ы. Я бы всё это дело (ID и Name) в атрибуты самого нода Task пихал.
Это вот так выглядеть будет?
<Task Kod_Task=".." Name_Task=".." Kod_Task=".." Name_Task=".." />
← →
Медвежонок Пятачок © (2011-09-21 12:26) [10]кошмар....
← →
Сергей М. © (2011-09-21 12:27) [11]
> alexis
Есть штатный класс TClientDataSet = class(TDataSet).
У него есть метод SaveToFile/Stream, у метода есть второй параметр Format, там можно указать формат сохранения данных - dfXML или dfXMLUTF8.
← →
Юрий Зотов © (2011-09-21 12:28) [12]> alexis (21.09.11 12:21) [9]
> Код ...выдает только одну последнюю запись из датасета.
Наверное, перед циклом надо вставить Датасет.First ?
← →
alexis (2011-09-21 12:31) [13]
> Сергей М. © (21.09.11 12:27) [11]
>
> Есть штатный класс TClientDataSet = class(TDataSet).
> У него есть метод SaveToFile/Stream, у метода есть второй
> параметр Format, там можно указать формат сохранения данных
> - dfXML или dfXMLUTF8.
TClientDataSet собираюсь использовать при загрузке из xml.
Сейчас нужно выгрузить в xml из нескольких связанных датасетов.
← →
Ega23 © (2011-09-21 12:32) [14]
> выдает только одну последнюю запись из датасета.
with TaskDS do
begin
First;
while not Eof do
begin
aCurrNode := aRootTaskNode.AddChild("Task");
aCurrNode.AddChild("Kod_Task");
aCurrNode.AddChild("NAIM_Task");
aCurrNode.ChildValues["Kod_Task"] := FieldByName("ID").AsString;
aCurrNode.ChildValues["NAIM_Task"] := FieldByName("NAIM").AsString;
Next;
end;
end;
> Это вот так выглядеть будет?
> <Task Kod_Task=".." Name_Task=".." Kod_Task=".." Name_Task=".
> ." />
Нет, он будет выглядеть<Tasks>
<Task Kod_Task=".." Name_Task=".."/>
...
<Task Kod_Task=".." Name_Task=".."/>
</Tasks>
ИМХО, это гораздо удобнее, чем кучу нодов плодить.
> Об этом я еще не думал.
"Фигли думать, трясти надо!" (с) бородатый анекдот
← →
alexis (2011-09-21 12:34) [15]
> Юрий Зотов © (21.09.11 12:28) [12]
Наверное, перед циклом надо вставить Датасет.First
В цикле все в порядке, идет перебор с первой до последней записи. Выгружается последняя в первый параметр ID и NAIM. Ну т.е. если цикл убрать, соответственно выгружается только первая запись.
← →
Ega23 © (2011-09-21 12:36) [16]
> Выгружается последняя в первый параметр ID и NAIM.
Всё правильно. Потому что ты скопировал мой код не вникая в его суть, а там опечатка закралась:
aRootTaskNode := aRootNode.AddChild("Tasks");
← →
alexis (2011-09-21 13:03) [17]
> Ega23 © (21.09.11 12:36) [16]
Ага, нашел я ее, точнее подправил под себя. Спасибо!
А как сделать так:<OIV ID="1" NAIM="xxx"
<Task Kod_Task="1" Name_Task=".."/>
<Task Kod_Task="2" Name_Task=".."/>
</OIV>>
← →
alexis (2011-09-21 13:04) [18]Пропустил одну скобочку.
<OIV ID="1" NAIM="xxx">
<Task Kod_Task="1" Name_Task=".."/>
<Task Kod_Task="2" Name_Task=".."/>
</OIV>
← →
Плохиш © (2011-09-21 13:49) [19]
> А как сделать так:
Die Eigenschaft Attributes repräsentiert die Attributwerte für den Knoten.
Delphi-Syntax:
property Attributes[const AttrName: DOMString]: OleVariant;
C++ Syntax:
__property OleVariant Attributes[const DOMString AttrName]= {read=GetAttribute, write=SetAttribute};
Beschreibung
Mit Hilfe von Attributes können Sie die Werte der Attribute des Knotens lesen oder festlegen. Über die Attribute kann ein Knoten in einem XML-Dokument geändert werden. Ein Beispiel:
<Movie genre="scifi" title="Star Wars"> ... </Movie>
genre und title sind in diesem Fall Attribute des Knotens, hier mit den Werten "scifi" und "Star Wars".
Im Index AttrName wird der Name des Attributs angegeben, auf das zugegriffen werden soll. Im obigen Beispiel sind genre und title die Attributnamen. Wenn Sie bei einem Schreibzugriff auf die Eigenschaft Attributes den Namen eines vorhandenen Attributs angeben, wird der Wert dieses Attributs geändert. Existiert dagegen kein Attribut mit dem angegebenen Namen, wird ein neues Attribut für den Knoten erzeugt.
Wenn Sie bei einem Lesezugriff auf die Eigenschaft Attributes einen Attributnamen angeben, der für den Knoten nicht existiert, ist der zurückgegebene Wert von der Eigenschaft Options des Dokuments abhängig, das den Knoten enthält. Wenn Options den Wert doAttrNull enthält, führt der Lesezugriff auf ein nicht vorhandenes Attribut zur Rückgabe einer Null-Variante. Ist der Wert doAttrNull nicht in Options enthalten, wird ein leerer String zurückgegeben.
Der Wert von Attributes besteht aus dem Text des angegebenen Attributs. Beim Festlegen von Attributen wird der Wertstring nicht analysiert. Markups im übergebenen Wert (z. B. Entitätsreferenz) werden als Literal interpretiert. Wenn Si en Attribut auf nil (Delphi) bzw. NULL (C++) setzen, wird es aus dem Knoten entfernt. Es ist möglich, einem Attribut einen leeren String als Wert zuzuweisen.
← →
Ega23 © (2011-09-21 13:50) [20]
> А как сделать так:
Пригласить программиста.
Блин, ну дал же код, ну что там непонятного-то?
← →
alexis (2011-09-21 14:07) [21]
> Блин, ну дал же код, ну что там непонятного-то?
Программисты они за деньги работают, а я за бесплатно.
Ваш код дает
<Task>
<Kod_Task>10</Kod_Task>
<NAIM_Task>...</NAIM_Task>
</Task>
<Task>
<Kod_Task>11</Kod_Task>
<NAIM_Task>...</NAIM_Task>
</Task>
Буду искать где я ошибся
← →
alexis (2011-09-21 14:09) [22]
> Плохиш © (21.09.11 13:49) [19]
Чего то я подзабыл немецкий, почти 20 лет со школы прошло.
← →
Плохиш © (2011-09-21 14:23) [23]Удалено модератором
← →
alexis (2011-09-21 14:36) [24]Удалено модератором
← →
Ega23 © (2011-09-21 15:11) [25]
> Ваш код дает
Правильно, именно это он и даёт. Ты же этого хотел?
← →
alexis (2011-09-21 15:17) [26]
> Ega23 © (21.09.11 15:11) [25]
>
> Правильно, именно это он и даёт. Ты же этого хотел?
Все верно, за что вам большое спасибо.
Дальше поинтерессовался как сделать так:<OIV ID="1" NAIM="xxx">
<Task Kod_Task="1" Name_Task=".."/>
<Task Kod_Task="2" Name_Task=".."/>
</OIV>
Не то чтобы мне очень надо, просто в базу гружу файлы такого формата, поэтому и интерессно как они получились.
← →
Ega23 © (2011-09-21 15:39) [27]
> Дальше поинтерессовался как сделать так:
Посмотри, как к IXMLNode добавляются атрибуты.
← →
Плохиш © (2011-09-21 16:21) [28]
> Ega23 © (21.09.11 15:39) [27]
>
>
Ты не умничай, ты код давай.
Нафига нужен форум, если все будут справку читать?
← →
alexis (2011-09-22 12:33) [29]Еще вопрос. Сколько уровней вложенности xml файла поддерживает TClietnDataSet?
Чего то на 4-м вложенном датасете все работать перестает
← →
Ega23 © (2011-09-22 13:21) [30]
> Сколько уровней вложенности xml файла поддерживает TClietnDataSet?
Никогда ему не доверял. Либо выгружал из MSSQL сразу в XML (есть там такая фича), либо ручками.
Не, по-быстрому посмотреть - это сойдёт. Но какую-то сложную структуру строить чё-та как-то сцыкотно...
← →
alexis (2011-09-22 13:33) [31]Видимо это XML mapper не может делать файл трансформации с вложением больше трех. Вручную файл трансформации дописал, заработало.
CleintDataSet использую правки данных в xml файле, что то типа небольшой локальной БД. Потом десятки таких файлов с одинаковой структурой и разными записями будут снова грузиться в БД (где такие записи уже есть и надо их проапдейтить). Другого способа изменить удаленно записи БД не нашел (доступа к БД удаленно нет).
← →
alexis (2011-09-27 11:53) [32]Так я делать научился
<OIV ID="1" NAIM="xxx">
<Task Kod_Task="1" Name_Task=".."/>
<Task Kod_Task="2" Name_Task=".."/>
</OIV>
А как сделать так:<OIV ID="1" NAIM="xxx" <Task Kod_Task="1" Name_Task=".."/><Task Kod_Task="2" Name_Task=".."/></OIV>
← →
Плохиш © (2011-09-27 12:12) [33]
> А как сделать так:
> <OIV ID="1" NAIM="xxx" <Task Kod_Task="1" Name_Task="..
> "/><Task Kod_Task="2" Name_Task=".."/></OIV>
>
Для этого надо переписать стандарт xml.
← →
alexis (2011-09-27 13:26) [34]Вот такая структура файла имеет право на жизнь?
<OIV NAME_OIV="QQQ" KOD_ID="3">
<Task Naim_Task="aaa" Kod_Task="8">
<Base ID="2" Naim="sss" Plan="2,84" Fakt="2,84" Offer=""/>
<Base ID="6" Naim="qqqqq" Plan="123" Fakt="123" Offer="123"/>
<Func Id_Func="2" Naim_Func="ddd">
<BaseF ID="4" Naim="fff" Plan="4330" Fakt="4330" Offer=""/>
</Func>
</Task>
</OIV>
Открываю такой файл в TClietnDataSet, поле Kod_Task заполнено только у первой записи, у остальных пустое. Если убрать одну из таблиц (Base или Func) в файле трансформации, то поле заполняется корректно.
← →
alexis (2011-10-10 17:27) [35]Объясните, пожалуйста, следующее.
Выгружаю данные из TDataSet в XML. Данные типа Float выгружаются с запятой в качестве разделителя дробной части. Все ок.
При открытии через связку TXMLTransformProvider и TClientDataSet в TDBGrid отображается только целая часть. Если в качестве разделителся стоит точка, то отображается все ок.
Что не так делаю?
← →
RWolf © (2011-10-10 17:33) [36]можно попытаться установить DecimalSeparator перед открытием.
← →
Медвежонок Пятачок © (2011-10-10 17:35) [37]перед открытием.
перед выгрузкой.
причем на точку.
← →
asail © (2011-10-10 19:28) [38]
> Медвежонок Пятачок © (10.10.11 17:35) [37]
> перед выгрузкой.
> причем на точку
Ага. И не забыть вернуть взад потом...
← →
alexis (2011-10-11 10:13) [39]И всего то? Спасибо! Все работает.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.01.22;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.004 c