Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi [erledigt] Knoten inmitten einer Datei duplizieren (https://www.delphipraxis.net/53784-%5Berledigt%5D-knoten-inmitten-einer-datei-duplizieren.html)

com3t 22. Sep 2005 13:14


[erledigt] Knoten inmitten einer Datei duplizieren
 
Hallo erstmal!

Habe folgendes Problem:

Delphi-Quellcode:

  appPath := ExtractFilePath( Application.ExeName );
  xmlDoc.LoadFromFile( appPath + 'template.xml' );
  xmlDoc.Active := true;
  header := xmlDoc.DocumentElement.ChildNodes['OrderHeader'];
  parts := xmlDoc.DocumentElement.ChildNodes['OrderDetail'].ChildNodes['ListOfItemDetail'];

  // Hier sollten beliebig viele Parts entstehen

  memoxmldata.Text := xmlDoc.XML.GetText;
Das ist mein Code, welcher folgende xml-Datei bearbeitet:

Delphi-Quellcode:

<Order>
  <OrderHeader>
     <bla>123</bla>
     <bla2>456</bla2>
  </OrderHeader>
  <OrderDetail>
    <ListOfItemDetail>
      <ItemDetail>
        <Part>1</Part>
        <Desc>Erstes Teil</Desc>
      </ItemDetail>
    <ListOfItemDetail>
  </OrderDetail>
</Order>
Nun, sollte es aber unterschiedlich viele ItemDetail Knoten geben, wie kann ich das bewerkstelligen ??

Sollte dann so aussehen( mit 2 solchen Knoten ), die entgültige Datei:

Delphi-Quellcode:
<Order>
  <OrderHeader>
     <bla>123</bla>
     <bla2>456</bla2>
  </OrderHeader>
  <OrderDetail>
    <ListOfItemDetail>
      <ItemDetail>
        <Part>1</Part>
        <Desc>Erstes Teil</Desc>
      </ItemDetail>
      <ItemDetail>
        <Part>2</Part>
        <Desc>Zweites Teil</Desc>
      </ItemDetail>
    <ListOfItemDetail>
  </OrderDetail>
</Order>
Vielen Dank für jegliche Hilfe

[edit]

Konnte es folgendermassen lösen:

Delphi-Quellcode:
appPath := ExtractFilePath( Application.ExeName );
  xmlDoc.LoadFromFile( appPath + 'template.xml' );
  xmlDoc.Active := true;
  header := xmlDoc.DocumentElement.ChildNodes['OrderHeader'];
  parts := xmlDoc.DocumentElement.ChildNodes['OrderDetail'].ChildNodes['ListOfItemDetail'].ChildNodes['ItemDetail'];

  { Hier entstehen beliebig viele Parts bzw. zur Zeit nur 2
    Sollte dann in eine Schleife rein, das Ganze, wobei das erste Element zuvor gefüllt werden sollte }

  tmpNode := parts.CloneNode( true );
  tmpNode.ChildNodes['Part'].Text := '2';
  xmlDoc.DocumentElement.ChildNodes['OrderDetail'].ChildNodes['ListOfItemDetail'].ChildNodes.Add( tmpNode );

  memoxmldata.Text := xmlDoc.XML.GetText;
[/edit]

marabu 23. Sep 2005 07:48

Re: [erledigt] Knoten inmitten einer Datei duplizieren
 
Hallo com3t,

herzlich willkommen in der Delphi-PRAXiS.

In deinem XML musst du das Element ListOfItemDetail schließen - wahrscheinlich ein Schreibfehler.
Mit cloneNode kannst du ja nur arbeiten, wenn schon ein item zum clonen existiert. Mach es besser so:

Delphi-Quellcode:
unit DemoFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, xmldom, XMLIntf, StdCtrls, msxmldom, XMLDoc;

type
  TDemoForm = class(TForm)
    XMLDoc: TXMLDocument;
    Memo: TMemo;
    AddButton: TButton;
    InitButton: TButton;
    procedure InitButtonClick(Sender: TObject);
    procedure AddButtonClick(Sender: TObject);
  private
    FNextPartNumber: cardinal;
    ItemList: IXMLNode;
    function GetNextPartNumber: cardinal;
  public
    procedure AddItem(sDesc: string);
    procedure InitDoc;
    property NextPartNumber: cardinal read GetNextPartNumber write FNextPartNumber;
  end;

var
  DemoForm: TDemoForm;

implementation

{$R *.dfm}

procedure TDemoForm.AddItem(sDesc: string);
begin
  with ItemList.AddChild('ItemDetail') do begin
    AddChild('Part').Text := IntToStr(NextPartNumber);
    AddChild('Desc').Text := sDesc;
  end;
end;

function TDemoForm.GetNextPartNumber: cardinal;
begin
  Inc(FNextPartNumber);
  Result := FNextPartNumber;
end;

procedure TDemoForm.InitDoc;
var
  nDetail: IXMLNode;
begin
  xmlDoc.DocumentElement := xmlDoc.CreateElement('Orders', '');
  with xmlDoc.DocumentElement do begin
    AddChild('OrderHeader');
    nDetail := AddChild('OrderDetail');
  end;
  ItemList := nDetail.AddChild('ListOfItemDetail');
end;

procedure TDemoForm.InitButtonClick(Sender: TObject);
begin
  InitDoc;
  Memo.Lines.Assign(xmlDoc.XML);
end;

procedure TDemoForm.AddButtonClick(Sender: TObject);
var
  sDesc: string;
begin
  sDesc := 'Description';
  if InputQuery('New item', 'Description', sDesc) and (sDesc <> '') then begin
    AddItem(sDesc);
    Memo.Lines.Assign(xmlDoc.XML);
  end;
end;

end.
Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz