Как вставить узел XML

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Velial
новенький
Сообщения: 36
Зарегистрирован: 02.07.2010 21:23:11

Как вставить узел XML

Сообщение Velial »

Доброго времени суток.
Поздравляю всех с наступающим Новым Годом!!!
Как в xml вставить узел? Именно вставить, а не добавить в конец.
То есть имеется например такой xml:

Код: Выделить всё

<?xml version="1.0"?>
<register>
  <usuario id="001">
    <nome>name1</nome>
  </usuario>
  <usuario id="002">
    <nome>name2</nome>
  </usuario>
</register>

а надо получить:

Код: Выделить всё

<?xml version="1.0"?>
<register>
  <usuario id="001">
    <nome>name1</nome>
  </usuario>
  <usuario id="003">
    <nome>name3</nome>
  </usuario>
  <usuario id="002">
    <nome>name2</nome>
  </usuario>
</register>

Использую XMLRead, XMLWrite, DOM.
Как это реализовать?
Заранее благодарен всем откликнувшимся.
Polugut
новенький
Сообщения: 19
Зарегистрирован: 25.02.2010 22:50:29

Сообщение Polugut »

InsertBefore создает узел перед указаным, в отличии от AppendChild, который добавляет после крайнего
Velial
новенький
Сообщения: 36
Зарегистрирован: 02.07.2010 21:23:11

Сообщение Velial »

Спасибо
Аватара пользователя
dangreen
новенький
Сообщения: 72
Зарегистрирован: 21.11.2010 19:55:49

Сообщение dangreen »

я не могу заставить присвоить узлу вальюм

Код: Выделить всё

Begin
  ReadXMLFile(db,'/usertable.xml');
  dbn:=db.CreateElement('green');
 
  db.DocumentElement.ChildNodes.Item[0].AppendChild(dbn);
  db.FirstChild.FirstChild.FirstChild.NodeValue:='gru';
  WriteXMLFile(db,'/usertable.xml');
end;

таблица до

Код: Выделить всё

<?xml version="1.0"?>
<Hardware>
  <Hardware>
  </Hardware>
</Hardware>

таблица после

Код: Выделить всё

<?xml version="1.0"?>
<Hardware>
  <Hardware>
    <green/>
  </Hardware>
</Hardware>

как видите нод создается а валью нет, что делать?
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

Ну все же хоть Вы и Я читали вот это: XML Tutorial/ru, все же стоит освежить память :)
Вот пример проги(форма) 3 баттона:

Код: Выделить всё

unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  XMLRead,XMLWrite,DOM;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
    XML:TXMLDocument;
    Node,NNode: TDOMNode;
begin
   ReadXMLFile(XML, 'C:\1.xml');

   Node:=XML.DocumentElement.ChildNodes.Item[0];
  if Node<>nil then
    begin
      NNode:= XML.CreateElement('green');//Создаём родительский узел
      TDOMElement(NNode).SetAttribute('Description', 'Description');// создаём атрибуты родительского узла
      Node.Appendchild(NNode);// добавляем  родительский узел
    end;

  WriteXMLFile(XML,'C:\1.xml');  // записываем всё в XML-файл
 FreeAndNil(XML);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
    XML:TXMLDocument;
    Node,NNode: TDOMNode;
begin
  ReadXMLFile(XML, 'C:\1.xml');

  Node:=XML.DocumentElement.ChildNodes.Item[0];  //Создаем узел

  if Node<>nil then
    begin
      NNode:= XML.CreateElement('green');//Создаём родительский узел
      NNode.TextContent:='Value';        // создаём текст узла
      Node.Appendchild(NNode);           // добавляем  родительский узел
    end;

  WriteXMLFile(XML,'C:\1.xml');// записываем всё в XML-файл

  FreeAndNil(XML);              //Освобождаем память
end;

procedure TForm1.Button3Click(Sender: TObject);
var
    XML:TXMLDocument;
    Node,NNode: TDOMNode;
begin
   ReadXMLFile(XML, 'C:\1.xml');

   Node:=XML.DocumentElement.ChildNodes.Item[0];
  if Node<>nil then
    begin
      NNode:= XML.CreateElement('green'); //Создаём родительский узел
      NNode.TextContent:='Value'; // создаём текст узла
      TDOMElement(NNode).SetAttribute('Description', 'Description');// создаём атрибуты родительского узла
      Node.Appendchild(NNode);// добавляем  родительский узел
    end;

  WriteXMLFile(XML,'C:\1.xml');  // записываем всё в XML-файл
 FreeAndNil(XML);
end;

end.


1Кнопка добавит узел с аттрибутом

Код: Выделить всё

<?xml version="1.0"?>
<Hardware>
  <Hardware>
    <green Description="Description"/>
  </Hardware>
</Hardware>


2Кнопка добавит простой текст в узел

Код: Выделить всё

<?xml version="1.0"?>
<Hardware>
  <Hardware>
    <green>Value</green>
  </Hardware>
</Hardware>


3Кнопка добавит и то и другое

Код: Выделить всё

<?xml version="1.0"?>
<Hardware>
  <Hardware>
    <green Description="Description">Value</green>
  </Hardware>
</Hardware>
Аватара пользователя
dangreen
новенький
Сообщения: 72
Зарегистрирован: 21.11.2010 19:55:49

Сообщение dangreen »

пасиб! :mrgreen:
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

Могу предложить исходники своих экспериментов XMLEditor.zip - в них много чего интересного есть, и как узел вставить и как в дерево загрузить... да и сам редактор практически рабочий - можно использовать для редактирования небольших xml-файлов под линуксом. Мож кому пригодиться. Мож кого на мысли какие умные наведёт. Мож кто допилит его и получицо прикольное программко :?: :D
Brych
незнакомец
Сообщения: 5
Зарегистрирован: 19.06.2015 00:10:57

Сообщение Brych »

Leo_bsv выложи пожалуйста свой XMLEditor снова, а то ссылка уже не действительная, а теперь сам таким занимаюсь и очень интересуют такие наработки. Заранее спасибо! :D
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

Программа переименована в Xedi, качнуть линуксовую версию с исходниками под i386 можно тут.
Ответить