AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi [erledigt] Knoten inmitten einer Datei duplizieren
Thema durchsuchen
Ansicht
Themen-Optionen

[erledigt] Knoten inmitten einer Datei duplizieren

Ein Thema von com3t · begonnen am 22. Sep 2005 · letzter Beitrag vom 23. Sep 2005
Antwort Antwort
com3t

Registriert seit: 22. Sep 2005
Ort: Kitzbühel
1 Beiträge
 
#1

[erledigt] Knoten inmitten einer Datei duplizieren

  Alt 22. Sep 2005, 14:14
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]
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: [erledigt] Knoten inmitten einer Datei duplizieren

  Alt 23. Sep 2005, 08:48
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz