AGB  ·  Datenschutz  ·  Impressum  







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

XRechnung: XML und CDATA

Ein Thema von bcvs · begonnen am 4. Aug 2020 · letzter Beitrag vom 5. Aug 2020
Antwort Antwort
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#1

XRechnung: XML und CDATA

  Alt 4. Aug 2020, 08:28
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?
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#2

AW: XRechnung: XML und CDATA

  Alt 4. Aug 2020, 14:56
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?
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#3

AW: XRechnung: XML und CDATA

  Alt 4. Aug 2020, 15:20
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).
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#4

AW: XRechnung: XML und CDATA

  Alt 4. Aug 2020, 15:58
Wo kommt den da das xmldoc.createCDATASection her? In meinem TXMLDocument gibts das nicht.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: XRechnung: XML und CDATA

  Alt 4. Aug 2020, 17:25
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?
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#6

AW: XRechnung: XML und CDATA

  Alt 4. Aug 2020, 18:14
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.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: XRechnung: XML und CDATA

  Alt 4. Aug 2020, 18:25
Hallo,
entweder &#xD;
oder &lt;br&gt; (Wobei das auch Html sein könnte)

hier gefunden:
https://stackoverflow.com/questions/...e-break-in-xml
Heiko
  Mit Zitat antworten Zitat
mlc42

Registriert seit: 9. Feb 2013
130 Beiträge
 
#8

AW: XRechnung: XML und CDATA

  Alt 4. Aug 2020, 22:20
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;
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#9

AW: XRechnung: XML und CDATA

  Alt 5. Aug 2020, 09:03
Aha, also auch ohne CDATA. Dann scheint das ja tatsächlich zu funktionieren.

Der Java Validator meckert auch nicht.
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.640 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: XRechnung: XML und CDATA

  Alt 5. Aug 2020, 13:44
da fragt man sich, warum die für Skonto so ein halbes CSV-Format definieren, anstatt das auch in XML abzubilden
Sven Harazim
--
  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:37 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