AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

XML zum Verzweifeln

Ein Thema von MyRealName · begonnen am 6. Sep 2023 · letzter Beitrag vom 2. Dez 2024
Antwort Antwort
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
697 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: XML zum Verzweifeln

  Alt 6. Sep 2023, 13:20
Ich habe jetzt im Endeffekt eine lauffähige rekursive Funktion, die den Namen des Unterlementes an den Parent-Namen (mit Punkt getrennt) anhängt. Das ganze wird

Code:
procedure IterateNode(ARoot: IXMLNode; ACurrentNodeName: String = '');
var
  lChild: IXMLNode;
  lNodeName: String;
begin
  lNodeName := IfThen(ACurrentNodeName <> '', ACurrentNodeName + '.', '');

  lChild := ARoot.ChildNodes.First;
  while Assigned(lChild) do
  begin
    if Not lChild.IsTextElement then
    begin
      if lChild.ChildNodes.Count > 0 then
      begin
        if DoIterate(lChild.NodeName) then
        begin
          CodeSite.EnterMethod(lChild.NodeName);
          IterateNode(lChild, lNodeName + lChild.NodeName);
          CodeSite.ExitMethod(lChild.NodeName);
        end;
      end;
    end else begin
      CodeSite.Send(csmLevel1, lNodeName + lChild.NodeName, VarToStr(lChild.NodeValue));

    end;
    lChild := lChild.NextSibling;
  end;
end;
Im Codesite wird das dann als Baum ausgegeben, leere Elemente werden unterdrückt. Dazu gibt es noch einen Aufruf von DoIterate, der Falsxe zurückliefert, wenn etwas nicht durchgegangen werden soll (ich muss einige Sachen gesondert behandeln).

Jedenfalls ist es eine lauffähige Lösung, damit der Thread auch einen Abschluss hat
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.533 Beiträge
 
Delphi 12 Athens
 
#2

AW: XML zum Verzweifeln

  Alt 6. Sep 2023, 13:44
https://www.embarcadero.com/docs/rad...ure-matrix.pdf
XML Bindings nur in Enterprise/Architect.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
724 Beiträge
 
Delphi 12 Athens
 
#3

AW: XML zum Verzweifeln

  Alt 6. Sep 2023, 17:20
Da geht es um was anderes, Tools um XML in datasets zu bekommen und zu exportieren. Der von mir angesprochene Wizard ist definitiv in der Pro-Version dabei, seit vielen Versionen.
Peter Below
  Mit Zitat antworten Zitat
WiPhi

Registriert seit: 19. Feb 2015
90 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: XML zum Verzweifeln

  Alt 7. Sep 2023, 06:52
Eine aufgepette Version des Databinding-Assistenten findet man auch hier:

https://github.com/MvRens/x2xmldatabinding

Diese unterstützt ein bisschen mehr als der Assistent in Delphi.
Wer sucht, der findet. Wer länger sucht, findet mehr.
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
697 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: XML zum Verzweifeln

  Alt 11. Okt 2023, 13:28
Ich habe das XML Databinding gefunden, das Problem war im Endeffekt, dass man dazu ein offenes Projekt haben muss.
Nun hat mir der Wizard 3 Funktionen in den erstellten Sourcecode mit reingegeben :

function GetORDER(Doc: IXMLDocument): IXMLORDERType;
function LoadORDER(const FileName: string): IXMLORDERType;
function NewORDER: IXMLORDERType;

(ORDER ist wohl der 1. Knoten...)

Nun die Frage... Sollte ich das Daten ändern wollen und das ganze wieder als XML speichern wollen, gibt es da auch eine Möglichkeit oder muss ich alles selbst machen und durch-iterieren ?

Edit: Kann man vllt den Start-Knoten "einfach" der Rootnode eines TXMLDocument zuweisen und los geht's ?

Geändert von MyRealName (11. Okt 2023 um 15:18 Uhr)
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
724 Beiträge
 
Delphi 12 Athens
 
#6

AW: XML zum Verzweifeln

  Alt 11. Okt 2023, 18:03
var
LOrder: IXMLOrderType;

LOrder.OwnerDocument.XML.Text sollte Dir den kompletten Inhalt des Baums als String liefern und den kannst Du dann in eine Datei schreiben. Dabei bitte das korrekte Encoding (normalerweise UTF-8) beachten.
Peter Below
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
697 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: XML zum Verzweifeln

  Alt 12. Okt 2023, 05:53
var
LOrder: IXMLOrderType;

LOrder.OwnerDocument.XML.Text sollte Dir den kompletten Inhalt des Baums als String liefern und den kannst Du dann in eine Datei schreiben. Dabei bitte das korrekte Encoding (normalerweise UTF-8) beachten.

Danke, das geht, nutze allerdings

LOrder.OwnerDocument.SaveToFile...
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
697 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: XML zum Verzweifeln

  Alt 13. Okt 2023, 07:46
So, ich will den Thread damit schliessen, dass ich kurz über die Fallstricke, und wie ich sie gelöst habe, schreibe, damit andere auch eine zufriedenstellende Lösung finden können.
Ich habe, wie gesagt wurde, den XML Data Binding Wizard genutzt, um die XML Datei einzulesen. Diese nutzte Namespaces, die natürlich nicht eingelesen wurden.
Nodes wie dieser
Code:
<bmecat:NAME2>Nebenstelle 2</bmecat:NAME2>
wurden zwar eingefügt, aber ohne "bmecat" Namespace.
Ich habe dazu die erzeugten Klassen erweitert :
Delphi-Quellcode:
function TXMLADDRESSType.Get_NAME2: UnicodeString;
begin
  Result := ChildNodes['bmecat:NAME2'].Text;
end;

procedure TXMLADDRESSType.Set_NAME2(const Value: UnicodeString);
begin
  if Value <> EmptyStr then
    ChildNodes['bmecat:NAME2'].NodeValue := Value;
end;
Dazu musste der Namespace aber entsprechend registriert werden, dies habe ich dann in der erstellen Funktion NewORDER gemacht (der Name kann bei anderen Klassen abweichen, ORDER war in meinem Fall der Rootnode.
Delphi-Quellcode:
function NewORDER: IXMLORDERType;
begin
  Result := NewXMLDocument.GetDocBinding('ORDER', TXMLORDERType, TargetNamespace) as IXMLORDERType;
  Result.Version := '2.1';
  Result.DeclareNamespace('xsi', 'http://www.w3.org/2001/XMLSchema-instance'); // von mir hinzugefügt
  Result.DeclareNamespace('xsd', 'http://www.w3.org/2001/XMLSchema'); // von mir hinzugefügt
  Result.DeclareNamespace('bmecat', 'http://www.bmecat.org/bmecat/2005'); // von mir hinzugefügt
end;
Jetzt gab es noch einen weiteren Fallstrick und zwar die Attribute in Verbindung mit Namespaces, wie hier :
Code:
<bmecat:PARTY_ID type="supplier_specific">0000055905</bmecat:PARTY_ID>
Dazu musste zum einen im erzeugten Delphi Code, wo der Node erzeugt wird, eine Änderung gemacht werden :
Delphi-Quellcode:
procedure TXMLPARTYType.AfterConstruction;
begin
  RegisterChildNode('bmecat:PARTY_ID', TXMLPARTY_IDType, 'http://www.bmecat.org/bmecat/2005');
  inherited;
end;

function TXMLPARTYType.Get_PARTY_ID: IXMLPARTY_IDType;
begin
  Result := ChildNodes['bmecat:PARTY_ID'] as IXMLPARTY_IDType;
end;
Dort wurde zum einen vor PARTY_ID jeweils "bmecat:" hinzugefügt, zum anderen aber auch in RegisterChildNode noch der 3. Parameter mit der bmecat-URL angegefügt.
Beim Beschreiben des Nodes wurde dann aber anstelle der einfachen Zuweisung wie
Delphi-Quellcode:
var
  lParty: IXMLPARTYType;
begin
  lParty := FXMLOrder.ORDER_HEADER.ORDER_INFO.PARTIES.Add;
  lParty.ADDRESS.NAME2 := AName2;
end;
dann der Node eher händisch erzeugt
Delphi-Quellcode:
var
  lParty: IXMLPARTYType;
  lNode: IXMLNode;
begin
  lParty := FXMLOrder.ORDER_HEADER.ORDER_INFO.PARTIES.Add;
  lNode := lParty.PARTY_ID;
  lNode.Attributes['type'] := ATTR_SUPPLIER_SPECIFIC;
  lNode.Text := ASupplierId;
end;
Beim Einlesen eines XML in die ereugten Objecte gibt es keine Probleme, aber falls man ein komplett neues XML-Dokument in diesem Standard erzeugen will muss man diese Umwege scheinbar gehen. Ist nicht so schlimm, muss man nur wissen

Ich hoffe es hilft, zu dem Thema auch eine abschliessende Lösung zu haben...
  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 04:43 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