Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   XRechnung: XML und CDATA (https://www.delphipraxis.net/205126-xrechnung-xml-und-cdata.html)

bcvs 4. Aug 2020 07:28

XRechnung: XML und CDATA
 
Hallo zusammen,

ich arbeite gerade an der Implementierung der XRechnung. Dazu benutze ich das TXMLDocument.

Für ein bestimmtes Element ist gefordert, dass Zeilenümbrüche im XML erhalten bleiben müssen. Also nehme ich einen CDATA-Knoten. Vom Prinzip her so:

Delphi-Quellcode:
Inhalt:='#SKONTO#TAGE=14#PROZENT=2.50#BASISBETRAG=11000.00#' + sLineBreak +
        '#SKONTO#TAGE=28#PROZENT=1.00#' + sLineBreak;

Node1:=RootNode.AddChild('cac:PaymentTerms');
  Node2:=Node1.AddChild('cbc:Note');
  Node3:=XMLDoc.CreateNode(Inhalt, ntCData);
  Node2.ChildNodes.Add(Node3)
Das funktioniert soweit ganz gut. Das XML sieht danach so aus:

Code:
  <cac:PaymentTerms>
    <cbc:Note>
      <![CDATA[#SKONTO#TAGE=14#PROZENT=2.50#BASISBETRAG=11000.00#
#SKONTO#TAGE=28#PROZENT=1.00#
]]>
    </cbc:Note>
  </cac:PaymentTerms>
Jetzt gibt es aber im Netz mindestens 2 Online-XRechnungs-Viewer, die sich an diesem Knoten stören und anmeckern, dass hier keine zusätzlichen Leerzeichen etc. vorhanden sein dürfen. Diese Syntax wird akzeptiert:

Code:
  <cac:PaymentTerms>
    <cbc:Note><![CDATA[#SKONTO#TAGE=14#PROZENT=2.50#BASISBETRAG=11000.00#
#SKONTO#TAGE=28#PROZENT=1.00#
]]></cbc:Note>
  </cac:PaymentTerms>

Deshalb meine Frage:
Wie bringe ich dem TXMLDocument bei, dass es das <![CDATA...]> direkt zwischen die Tags <cbc:Note></cbc:Note> schreibt, ohne weitere Zeilenumbrücke oder Leerzeichen?

bcvs 4. Aug 2020 13:56

AW: XRechnung: XML und CDATA
 
Ich behelfe mir jetzt mit diesem Workaraound:
Das TXMLDocument hat ja die Eigenschaft XML, über die man als TStrings auf die einzelnen Zeilen des XML zugreifen kann. Darin mache ich jetzt die erforderlichen Umformatierungen und speichere es mit XMLDocument.XML.SaveToFile ab.

Ist nicht besonders elegant, aber es funktioniert. Oder hat jemand eine bessere Lösung?

Moombas 4. Aug 2020 14:20

AW: XRechnung: XML und CDATA
 
Schau mal ob dir das hier weiter hilft: https://www.delphipraxis.net/71324-cdata-auslesen.html (Post #4)
Dort wird das CData anders angelegt (als Element und nicht als Knoten).

bcvs 4. Aug 2020 14:58

AW: XRechnung: XML und CDATA
 
Wo kommt den da das
Delphi-Quellcode:
xmldoc.createCDATASection
her? In meinem TXMLDocument gibts das nicht.

Lemmy 4. Aug 2020 16:25

AW: XRechnung: XML und CDATA
 
Zitat:

Zitat von bcvs (Beitrag 1471090)
Delphi-Quellcode:
Inhalt:='#SKONTO#TAGE=14#PROZENT=2.50#BASISBETRAG=11000.00#' + sLineBreak +
        '#SKONTO#TAGE=28#PROZENT=1.00#' + sLineBreak;

Deshalb meine Frage:
Wie bringe ich dem TXMLDocument bei, dass es das <![CDATA...]> direkt zwischen die Tags <cbc:Note></cbc:Note> schreibt, ohne weitere Zeilenumbrücke oder Leerzeichen?

indem du die Zeilenumbrüche weg lässt?

Delphi-Quellcode:
Inhalt:='#SKONTO#TAGE=14#PROZENT=2.50#BASISBETRAG=11000.00#' +
        '#SKONTO#TAGE=28#PROZENT=1.00#';
Oder verstehe ich hier was nicht? Und wenn ja, was genau?

bcvs 4. Aug 2020 17:14

AW: XRechnung: XML und CDATA
 
Zitat:

Zitat von Lemmy (Beitrag 1471180)
indem du die Zeilenumbrüche weg lässt?

Einfach weglassen geht nicht, denn (aus der Dokumentation des Standards XRechnung):

Zitat:

Jeder Eintrag beginnt mit einer #, die Segmente sind mit einer # getrennt und eine Zeile schließt mit einer # ab. Am Ende einer vollständigen Skonto- oder Verzugsangabe muss ein XML-konformer Zeilenumbruch folgen.
Fragt sich nur, was hier mit XML-konformer Zeilenumbruch gemeint ist. Gerade habe ich festgestellt, dass so etwas anscheinend auch funktioniert:
Code:
  <cac:PaymentTerms>
    <cbc:Note>#SKONTO#TAGE=14#PROZENT=2.50#BASISBETRAG=11000.00#
#SKONTO#TAGE=28#PROZENT=1.00#
</cbc:Note>
  </cac:PaymentTerms>
Da bräuchte man kein CDATA. Aber das ist doch nach meinem Verständnis kein XML-konformer Zeilenumbruch zwischen den beiden #SKONTO-Zeilen. Vielleicht sind meine getesteten Viewer da einfach nur zu fehlertolerant. Ich denke, ich bleibe bei der CDATA-Lösung.

hoika 4. Aug 2020 17:25

AW: XRechnung: XML und CDATA
 
Hallo,
entweder &#xD;
oder &lt;br&gt; (Wobei das auch Html sein könnte)

hier gefunden:
https://stackoverflow.com/questions/...e-break-in-xml

mlc42 4. Aug 2020 21:20

AW: XRechnung: XML und CDATA
 
Die Viewer sind teilweise sehr tolerant. Ich teste das erst mit dem Java Validator und dann mit dem Ultramarin Viewer.
Der Validator scheint ziemlich pingelig zu sein.

Mit dem Skonto funktioniert das bei mir so:



function skonto:string;
begin
//#SKONTO#TAGE=14#PROZENT=2.25# mehrere Zeilen
result := '#SKONTO#TAGE='+VPrintForm.QVORGANG.FieldByName('Z AHLB1TAGE').AsString+'#PROZENT='+floatp2str(VPrint Form.QVORGANG.FieldByName('ZAHLB1SKONTO').AsFloat) +'#'+#13+#10+ '#SKONTO#TAGE='+VPrintForm.QVORGANG.FieldByName('Z AHLB2TAGE').AsString+'#PROZENT='+floatp2str(VPrint Form.QVORGANG.FieldByName('ZAHLB2SKONTO').AsFloat) +'#'+#13+#10+ '#SKONTO#TAGE='+VPrintForm.QVORGANG.FieldByName('Z AHLB2TAGE').AsString+'#PROZENT='+floatp2str(VPrint Form.QVORGANG.FieldByName('ZAHLB3SKONTO').AsFloat) +'#';
end;

...

Anode1:= FRootNode.AddChild('cac:PaymentTerms');
ANode1.AddChild('cbc:Note').Text:=skonto;

bcvs 5. Aug 2020 08:03

AW: XRechnung: XML und CDATA
 
Aha, also auch ohne CDATA. Dann scheint das ja tatsächlich zu funktionieren.

Der Java Validator meckert auch nicht.

sh17 5. Aug 2020 12:44

AW: XRechnung: XML und CDATA
 
da fragt man sich, warum die für Skonto so ein halbes CSV-Format definieren, anstatt das auch in XML abzubilden


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