Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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&#228;sentiert die Attributwerte f&#252;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&#246;nnen Sie die Werte der Attribute des Knotens lesen oder festlegen. &#220;ber die Attribute kann ein Knoten in einem XML-Dokument ge&#228;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&#228;ndert. Existiert dagegen kein Attribut mit dem angegebenen Namen, wird ein neues Attribut f&#252;r den Knoten erzeugt.

Wenn Sie bei einem Lesezugriff auf die Eigenschaft Attributes einen Attributnamen angeben, der f&#252;r den Knoten nicht existiert, ist der zur&#252;ckgegebene Wert von der Eigenschaft Options des Dokuments abh&#228;ngig, das den Knoten enth&#228;lt. Wenn Options den Wert doAttrNull enth&#228;lt, f&#252;hrt der Lesezugriff auf ein nicht vorhandenes Attribut zur R&#252;ckgabe einer Null-Variante. Ist der Wert doAttrNull nicht in Options enthalten, wird ein leerer String zur&#252;ckgegeben.

Der Wert von Attributes besteht aus dem Text des angegebenen Attributs. Beim Festlegen von Attributen wird der Wertstring nicht analysiert. Markups im &#252;bergebenen Wert (z. B. Entit&#228;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&#246;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
2-1318357787
Очень злой
2011-10-11 22:29
2012.01.22
Что такое object и как с ним работать?


4-1243546594
imprezident
2009-05-29 01:36
2012.01.22
Работа с компонентами стороннего приложения


10-1176806385
Yanis
2007-04-17 14:39
2012.01.22
Нет ли у кого-нибудь файлика или описания


15-1317627402
OW
2011-10-03 11:36
2012.01.22
Задумка. Игра Пираты. Интересно ли будет?


2-1318317392
алешка
2011-10-11 11:16
2012.01.22
Значение в ячейке





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