Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с XML, поиск юзал - не нашел 
V
    Опции темы
Insert
  Дата 6.12.2006, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 13.4.2006

Репутация: 1
Всего: 1



 Здравствуйте,
 Никогда не работал с XML, а тут пришлось. Так вот для работы использовал XMLDocument, есть файл допустим такой структуры:
Код

  <main>
     <root>
          <first>аааа</first> 
          <second>ииии</second> 
     </root>
  </main>

 У меня значения в блоке <root></root> разные бывают и надо накапливать этот блок с разными значениями, 
 я пытаюсь делать это так:
 
Код

 xml.AddChild('main');
 xml.ChildNodes['main'].AddChild('root');
 node:=xml.ChildNodes['main'].ChildNodes['root'];
 node.AddChild('first');
 node.AddChild('second');
 node.ChildNodes.Nodes[0].Text:='aaaa';
 node.ChildNodes.Nodes[1].Text:='ииии';
 xml.SaveToFile(save.FileName);
 
 но при многократном выполнении данной процедуры получается что то вроде:
Код

 <main>
- <root>
  <first>aaaa</first> 
  <second>ииии</second> 
  <first /> 
  <second /> 
  </root>
  <root /> 
  </main>

а хотел бы:
Код

 <main>
- <root>
    <first>aaaa</first> 
    <second>ииии</second> 
   </root>
  <root> 
   <first>aaaa</first> 
   <second>ииии</second> 
  </root>
  </main>

 вопрос как? я знаю что нада обращатся по индексу, но где хз.
Заранее спасибо smile 

--------------------
пьяный русский кодер практически непобедим
PM MAIL   Вверх
Rodman
Дата 6.12.2006, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



Insert, 
Код

  <first /> 
  <second /> 


такие записи значат, что поля пустые... 


мож это тебе поможет...

Я выбирал данные при помощи XMLDocument, а вот с добавлением как то не пробовал...
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Insert
Дата 7.12.2006, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 13.4.2006

Репутация: 1
Всего: 1



пасиб Rodman, глянул, но там с добавлением примера нет, так что если у кого есть выложите пожалста smile  smile 
--------------------
пьяный русский кодер практически непобедим
PM MAIL   Вверх
Rodman
Дата 7.12.2006, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



ну вот еще нашел...
Код

XMLDoc.pas

//Change 1)
...
    FReadOnly: Boolean;
    FDoSpecialInsert: Boolean; // <-- add this (line 143 in my copy)
    FOnHostChildNotify: TNodeListNotification;
    FOnHostAttrNotify: TNodeListNotification;
  protected
...

//Change 2)
...
    function GetPrefix: DOMString;
    function GetReadOnly: Boolean;
    function GetSpecialInsert: Boolean; // <-- add this (line 168 in my copy)
    function GetText: DOMString;
    function GetXML: DOMString;
    procedure SetAttribute(const AttrName: DOMString; const Value: OleVariant);
    procedure SetChildValue(const IndexOrName: OleVariant; const Value: OleVariant);
    procedure SetNodeValue(const Value: OleVariant);
    procedure SetSpecialInsert(const DoSpecialInsert: Boolean);  // <-- add this (line 174 in my copy)
    procedure SetReadOnly(const Value: Boolean);
    procedure SetText(const Value: DOMString);
....

//Change 3)
...
    property OwnerDocument: TXMLDocument read FDocument;
    property ParentNode: TXMLNode read FParentNode;
    property SpecialInsert: Boolean read GetSpecialInsert write SetSpecialInsert; // <-- add this (line 247 for me)
  public
    constructor Create(const ADOMNode: IDOMNode; const AParentNode: TXMLNode;
...

//Change 4)
...
constructor TXMLNode.Create(const ADOMNode: IDOMNode;
  const AParentNode: TXMLNode; const OwnerDoc: TXMLDocument);
begin
  inherited Create;
  ...
  FIsDocElement := Assigned(FParentNode) and
    (FParentNode.GetNodeType = ntDocument) and (GetNodeType = ntElement);
  FDoSpecialInsert := False; // <-- add this line
end;

//Change 5)

procedure TXMLNode.ChildListNotify(Operation: TNodeListOperation;
      var Node: IXMLNode; const IndexOrName: OleVariant; BeforeOperation: Boolean);
const
  NodeChangeMap: array[TNodeListOperation] of TNodeChange = (ncInsertChild,
    ncRemoveChild, ncInsertChild);
var
  I, CNUpdateCount: Integer; // <-- add CNUpdateCount variable
  HostedNode: TXMLNode;
begin
  DoNodeChange(NodeChangeMap[Operation], BeforeOperation);
  CNUpdateCount := ChildNodes.UpdateCount; // <-- add this line
  if BeforeOperation and (CNUpdateCount = 0) then begin // <-- modify this line
    case Operation of
      nlRemove:
      ...
      nlInsert:
      ...
      nlCreateNode:
      ...
    end;
  // DATE: 2.5.2005 - MAJOR HACK -
  // Observation: The IXML* stuff is a wrapper around the IDOM* stuff - and two
  // separate sets of nodes are maintained in a synchronised state (?!!!) - in 'List'
  // for the IXML* stuff, and a DOMNode for the IDOM* stuff. If BeginUpdate/EndUpdate
  // used, the IDOM stuff doesn't get updated, but the IXML* stuff does - nodes are
  // created/removed, but only in List (?!!!). Without BeginUpdate/EndUpdate, writes
  // are VERY slow (still slow anyway, but more than 2x as quick). The slow part seems
  // to be due to:
  // Assert(DOMNode.childNodes.length = FChildNodes.Count);
  // if LongWord(IndexOrName) >= LongWord(DOMNode.ChildNodes.length) then
  // ...those two bits. So I've added a new chunk (below) which misses out those tests
  // - they're designed for a generic set of circumstances, whereas I can KNOW that
  // I'm just adding new nodes when I set the new SpecialInsert switch, so the tests
  // can be missed out (?!!!).
  end else if (SpecialInsert) and (BeforeOperation) and (CNUpdateCount > 0) then begin // <-- add
    DOMNode.appendChild(Node.DOMNode); // <-- add
    (Node as IXMLNodeAccess).SetParentNode(Self); // <--- add
  end;
  if Assigned(FHostedNodes) then
    for I := 0 to FHostedNodes.Count - 1 do
    begin
      HostedNode := TXMLNode(FHostedNodes[I]);
      if Assigned(HostedNode.OnHostChildNotify) then
          HostedNode.OnHostChildNotify(Operation, Node, IndexOrName, BeforeOperation);
    end;
end;

//Change 6)

// Add these somewhere within the TXMLNode listing
function TXMLNode.GetSpecialInsert: Boolean;
begin
  Result := FDoSpecialInsert;
end;

procedure TXMLNode.SetSpecialInsert(const DoSpecialInsert: Boolean);
begin
  FDoSpecialInsert := DoSpecialInsert;
end;
{
I'm copying those bits by doing a dff comparison between the original and modified copies, so there's a chance I might've missed
something out. To use the 'faster' Insert you have to set the 'SpecialInsert' property to True, then False when you're finished.
Example:
}
// Add some strings to an XML document: MyXMLDoc is a global TXMLDocument descendant
procedure TFileListHTTPHead.AddToXML(const AStringList: TStringList);
var
  Loop: Integer;
begin
  MyXMLDoc.ANode.ChildNodes.BeginUpdate;
  try
    MyXMLDoc.ANode.SpecialInsert := True;
    for Loop := 0 to AStringList.Count - 1 do
      MyXMLDoc.ANode.Add(AStringList.Strings[Loop]);
  finally
    MyXMLDoc.ANode.EndUpdate;
    MyXMLDoc.ANode.SpecialInsert := False;
  end;
end; 


Добавлено @ 13:44 
Код

//create root node
Root := XMLDocument2.Node.AddChild('Pizza');

ChildLevel1 := Root.AddChild('Toppings');
ChildLevel2 := ChildLevel1.AddChild('ToppingsA');
ChildLevel2.Text := cheddar;
ChildLevel2 := ChildLevel1.AddChild('ToppingsB');
ChildLevel2.Text := pepparoni;
ChildLevel2 := ChildLevel1.AddChild('ToppingsC');
ChildLevel2.Text := cheese;
ChildLevel2 := ChildLevel1.AddChild('ToppingsD');
ChildLevel2.Text := bbqsauce;
ChildLevel2 := ChildLevel1.AddChild('ToppingsE');
ChildLevel2.Text := onions;

XMLDocument2.SaveToFile(GetCurrentDir + '\filename.xml');


Код

var
root, node: iXMLNode;
i: word;

begin
root := XMLDocument.AddChild( "table" );

table.First;
while not table.eof do begin

node := root.AddChild( "record" );

for i := 0 to table.FieldCount -1 do
node.AddChild( table.Fields[ i ].FieldName ).NodeValue := table.Fields[
i ].AsString;


table.Next;

end; //not eof

end;


Это сообщение отредактировал(а) Rodman - 7.12.2006, 13:54
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Insert
Дата 7.12.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 13.4.2006

Репутация: 1
Всего: 1



Пасиб ща заценю smile 
--------------------
пьяный русский кодер практически непобедим
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1176 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.