Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Zeilenumbrüche gehen bei Zuweisung an XML-Bindung verloren (https://www.delphipraxis.net/180726-zeilenumbrueche-gehen-bei-zuweisung-xml-bindung-verloren.html)

rakekniven 12. Jun 2014 11:32

Zeilenumbrüche gehen bei Zuweisung an XML-Bindung verloren
 
Hallo,

ich bekomme XML von einer DLL geliefert.
Das XML dumpe ich mir weg.
Im XML gibt es den Inhalt: (Man beachte den Zeilenumbruch bei AdditionalTextUser)
Code:
                <ProfileData>
                    <AdditionalTextUser>Positionierhinweis
1120 P1200Positionierhinweis
1120 P1200Positionierhinweis
1120 P1200</AdditionalTextUser>
               <\ProfileData>
Nun weise ich das XML einem Interface zu:
Code:
xyz_Received_XML: TXMLDocument;
xyz_XML        : IXMLxyzInterface;

xyz_XML := GetxyzInterface(xyz_Received_XML);
Aufruf aus Interface
Code:
function GetxyzInterface(Doc: IXMLDocument): IXMLxyzInterface;

Wenn ich nun auf das Element "AdditionalTextUser" zugreife, es ist vom Typ String, dann erhalte ich den Inhalt jedoch ohne CRLF.

Das Interface habe ich von einem XSD-Schema erstellt und bis auf den Zeilenumbruch funktioniert es wunderbar.

Wie kann ich die Zeilenumbrüche bewahren?

himitsu 12. Jun 2014 11:52

AW: Zeilenumbrüche gehen bei Zuweisung an XML-Bindung verloren
 
Das ist auch vollkommen korrekt so.
Genau wie in HTML gibt es im XML keine Zeilenumbrüche ein oder mehre Zeileinumbrüche/Leerzeichen ergeben immer nur eine Leerzeichen, nach dem Auslesen.

Außer man man legt die Texte in entsprechende Tags ab, welche so definiert wurden, daß sie Zeilenumbrüche enthalten sollen,
wie es z.B. beim CDATA der Fall ist.

Oder man erstellt sich ein eigenes XML Schemata (DTD), wo man AdditionalTextUser als ein Solches deklariert.

Der schöne Günther 12. Jun 2014 12:03

AW: Zeilenumbrüche gehen bei Zuweisung an XML-Bindung verloren
 
Es geht aber um den Inhalt eines Knotens, nicht die Dokumentstruktur an sich. Die ganze CDATA-Geschichte habe ich vergessen, aber ich glaube, der Zeilenumbruch sollte erhalten bleiben, da hat er schon Recht.

Und bei mir wird er das auch.

Hier ein Beispiel:

Delphi-Quellcode:
program Project4;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  XmlIntf,
  XmlDoc,ActiveX;


const

   xmlContent: String =
      '         <ProfileData>' + #13#10 +
      '                <AdditionalTextUser>Positionierhinweis' + #13#10 +
       '1120 P1200Positionierhinweis' + #13#10 +
       '1120 P1200Positionierhinweis' + #13#10 +
       '1120 P1200</AdditionalTextUser>' + #13#10 +
       '            </ProfileData>';

var
   xmlClassRef: TXMLDocument;
   xmlIntfRef: IXMLDocument;
   node: IXMLNode;

begin
   CoInitializeEx(nil, COINIT_APARTMENTTHREADED);


   xmlClassRef := TXmlDocument.Create(nil);
   xmlClassRef.LoadFromXML(xmlContent);

   xmlIntfRef := xmlClassRef;

   WriteLn(xmlIntfRef.XML.Text);

   node := xmlIntfRef.DocumentElement.ChildNodes.First();

   writeLn(sLineBreak);
   WriteLn(node.Text);

   writeLn(sLineBreak);
   writeln(node.NodeValue);


   readln;
end.
Produziert:
Code:
<ProfileData>
   <AdditionalTextUser>Positionierhinweis
1120 P1200Positionierhinweis
1120 P1200Positionierhinweis
1120 P1200</AdditionalTextUser>
</ProfileData>



Positionierhinweis
1120 P1200Positionierhinweis
1120 P1200Positionierhinweis
1120 P1200


Positionierhinweis
1120 P1200Positionierhinweis
1120 P1200Positionierhinweis
1120 P1200
Ich weiß nicht, warum du überhaupt zunächst ein TXMLDocument hast. Und was das komische Interface macht. Wie ist es definiert?

himitsu 12. Jun 2014 13:03

AW: Zeilenumbrüche gehen bei Zuweisung an XML-Bindung verloren
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1262060)
aber ich glaube, der Zeilenumbruch sollte erhalten bleiben, da hat er schon Recht.

Eben nicht.
Standardmäßig sind alle normalen Knoten als TEXT definiert und TEXT hat nunmal keine Zeilenumbrüche im "Text". CDATA schon.
Denn diese Zeilenumbrüche werden da nur zum "Formatieren" der XML-Datei verwendet und nicht für den Inhalt, drum ist das Alles auch das Selbe.

XML-Code:
<abc>
  Text    {stell dir hier viele Leerzeichen/Tabs vor, welche die liebe DP "wegoptimiert"}      Text
</abc>

<abc>Text Text</abc>

<abc>Text
Text</abc>


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