![]() |
[erledigt] Knoten inmitten einer Datei duplizieren
Hallo erstmal!
Habe folgendes Problem:
Delphi-Quellcode:
Das ist mein Code, welcher folgende xml-Datei bearbeitet: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;
Delphi-Quellcode:
Nun, sollte es aber unterschiedlich viele ItemDetail Knoten geben, wie kann ich das bewerkstelligen ??<Order> <OrderHeader> <bla>123</bla> <bla2>456</bla2> </OrderHeader> <OrderDetail> <ListOfItemDetail> <ItemDetail> <Part>1</Part> <Desc>Erstes Teil</Desc> </ItemDetail> <ListOfItemDetail> </OrderDetail> </Order> Sollte dann so aussehen( mit 2 solchen Knoten ), die entgültige Datei:
Delphi-Quellcode:
Vielen Dank für jegliche Hilfe
<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> [edit] Konnte es folgendermassen lösen:
Delphi-Quellcode:
[/edit]
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; |
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:
Grüße vom marabu
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. |
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