Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XML Problem (https://www.delphipraxis.net/96705-xml-problem.html)

Pumba 29. Jul 2007 15:00


XML Problem
 
Hallo


Habe folgendes problem mit der speicherung eines XML files
Ich arbeite mit Delphi 2006, MSXML 4.0 und Win XP.
Nach dem Import eines csv File wird es in ein xml gepeichert


mit folgenden Code schreibe ich das xml

Delphi-Quellcode:
 xmlDoc := CoDOMDocument40.Create;
 //xmlDoc.setProperty('NewParser', True);

 if not FileExists(fAppPath +  Databasename) then
  begin
    xmlDoc.loadXML('<?xml version="1.0"?><Produktion/>');
  end else
      xmlDoc.load(fAppPath + Databasename);

   if xmlDoc.parseError.errorCode <> 0  then
     begin
       MessageDlg('Die XML Datei ist nicht korrekt!',mtError,[mbOK],0);
     end;

  NewProduktion := xmlDoc.createElement('Produktion');
  NewSub := xmlDoc.createElement('Datum');
  NewSub.text := ZDatum;
  NewProduktion.appendChild(NewSub);

  NewSub := xmlDoc.createElement('Uhrzeit');
  NewSub.text := ZZeit;
  NewProduktion.appendChild(NewSub);

  NewSub := xmlDoc.createElement('PLZ');
  NewSub.text := '2320';
  NewProduktion.appendChild(NewSub);

  NewSub := xmlDoc.createElement('UserID');
  NewSub.text := 'uXXXXX';
  NewProduktion.appendChild(NewSub);

  NewSub := xmlDoc.createElement('Eingang');
  NewSub.text := '008';
  NewProduktion.appendChild(NewSub);

  NewSub := xmlDoc.createElement('Produktkennzeichen');
  NewSub.text := '?';
  NewProduktion.appendChild(NewSub);

  NewSub := xmlDoc.createElement('Code1');
  NewSub.text := (exparr[4]);
  NewProduktion.appendChild(NewSub);

  NewSub := xmlDoc.createElement('Code2');
  NewSub.text := (exparr[2]);
  NewProduktion.appendChild(NewSub);

  NewSub := xmlDoc.createElement('Gewicht');
  NewSub.text := (exparr[7]);
  NewProduktion.appendChild(NewSub);

  NewSub := xmlDoc.createElement('StatusID');
  NewSub.text := '?';
  NewProduktion.appendChild(NewSub);



  xmlDoc.documentElement.appendChild(NewProduktion);

  xmlDoc.save(fAppPath + Databasename);
und bekomme folgenden xml inhalt

<?xml version="1.0" ?>
- <Produktion>
- <Produktion>
<Datum>26.07.2007</Datum>
<Uhrzeit>15:45:01</Uhrzeit>
<PLZ>2320</PLZ>
<UserID>uXXXXX</UserID>
<Eingang>008</Eingang>
<Produktkennzeichen>?</Produktkennzeichen>
<Code1>AA00101367022830</Code1>
<Code2>000000203709371000000</Code2>
<StatusID>?</StatusID>
</Produktion>
- <Produktion>
<Datum>26.07.2007</Datum>
<Uhrzeit>15:45:01</Uhrzeit>
<PLZ>2320</PLZ>
<UserID>uXXXXX</UserID>
<Eingang>008</Eingang>
<Produktkennzeichen>?</Produktkennzeichen>
<Code1>AA00101367234560</Code1>
<Code2>000000203709371876540</Code2>
<StatusID>?</StatusID>
</Produktion>
</Produktion>


wie stelle ich es an das der xml inhalt so gespeichert wird


<?xml version="1.0" ?>
- <Produktion>
<Produktion Datum="20.07.2007" Uhrzeit="15:05:00" PLZ="2320" UserID="uXXXXX" Eingang="008" Produktkennzeichen="?" Code1="AA700471" Code2="0000108300875960" StatusID="?" />
<Produktion Datum="20.07.2007" Uhrzeit="15:05:14" PLZ="2320" UserID="uXXXXX" Eingang="008" Produktkennzeichen="?" Code1="AA005320" Code2="0000108300875977" StatusID="?" />
</Produktion>

ebenso sollte wenn z.b. Code1 keine Zeichen enthält dieser nicht im xml enthalten sein

vielen dank
lg
pumba

marabu 29. Jul 2007 15:28

Re: XML Problem
 
Hallo pumba,

wenn du statt der Unterelemente lieber Attribute erzeugen möchtest, dann ist - vielleicht auch aus anderen Gründen - dieser Thread bestimmt hilfreich für dich: attribute die ich gar nicht explizit erstellt habe.

Vielleicht solltest du auch dein Schema nochmal überdenken. Produktion als Unterelement von Produktion finde ich nicht sehr elegant. Oft fällt die Entscheidung Element oder Attribut schwer, aber eine simple Regel hilft da ganz gut: Wenn du Informationen hast, die ein Objekt originär beschreiben, dann mache diese Informationen zu Unterelementen. Handelt es sich eher um Steuerinformationen, dann speichere sie als Attribut.

Grüße vom marabu

generic 29. Jul 2007 15:32

Re: XML Problem
 
du willst die daten als "attribute" speichern.

erzeuge den knoten. dann kannst du mit
Delphi-Quellcode:
knoten.setattribute('feld', 'wert');
die daten setzen.

Pumba 29. Jul 2007 15:50

Re: XML Problem
 
Danke für die schnellen Antworten

Leider wird mir das schema vorgeschrieben
die ausgabe muss so erstellt werden.

<?xml version="1.0" ?>
- <Produktion>
<Produktion Datum="20.07.2007" Uhrzeit="15:05:00" PLZ="2320" UserID="uXXXXX" Eingang="008" Produktkennzeichen="?" Code1="AA700471" Code2="0000108300875960" StatusID="?" />
<Produktion Datum="20.07.2007" Uhrzeit="15:05:14" PLZ="2320" UserID="uXXXXX" Eingang="008" Produktkennzeichen="?" Code1="AA005320" Code2="0000108300875977" StatusID="?" />
</Produktion>


werde mal suchen ob ich was finde wie man knoten erstellt und attribute speichert

vielen dank

marabu 29. Jul 2007 16:04

Re: XML Problem
 
Hallo Pumba,

beim Stöbern im XML-Forum der DP hast du ja jetzt schon einige Code-Beispiele gesehen. Das Erzeugen von Elementen wird im von dir gezeigten Code über die Methode createElement() erledigt. Und die Methode setAttribute() hast du jetzt auch schon im Einsatz gesehen. Das Ausklammern von Werten ist auch recht einfach:

Delphi-Quellcode:
// ..
  if exparr[4] <> '' then
  begin
    NewSub := xmlDoc.createElement('Code1');
    NewSub.text := (exparr[4]);
    NewProduktion.appendChild(NewSub);
  end;
// ...
Oder auf Attribute umgestellt:

Delphi-Quellcode:
// ..
  if exparr[4] <> '' then
    NewProduktion.setAttribute('Code1', exparr[4]);
// ...
Freundliche Grüße

Pumba 29. Jul 2007 16:29

Re: XML Problem
 
Hallo marabu

ich habe setAttribute nicht in meiner auswahl?

l.g
pumba

marabu 29. Jul 2007 16:43

Re: XML Problem
 
Welchen Typ hat denn NewProduktion?

Pumba 29. Jul 2007 16:49

Re: XML Problem
 
NewProduktion hat IXMLDOMNode

marabu 29. Jul 2007 16:53

Re: XML Problem
 
Ich hätte NewProduktion gleich als IXMLDOMElement deklariert, dann musst du dir nicht erst das passende Interface besorgen:

Delphi-Quellcode:
with NewProduktion as IXMLDOMElement do
  setAttribute('Code1', exparr[4]);
Man kann natürlich auch mit IXMLNode arbeiten, aber dann wird der Ausdruck etwas länger ...

Nur der Vollständigkeit halber:

Delphi-Quellcode:
NewProduktion.attributes.setNamedItem(xmlDoc.createAttribute('Code1')).text := exparr[4];

Pumba 29. Jul 2007 17:13

Re: XML Problem
 
SUPER Danke marabu

es funkt

vielen vielen dank ist echt das beste delphi forum

l.g.
Pumba


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:22 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