Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XML: Im Absatz Text und Tags kombinieren (https://www.delphipraxis.net/160777-xml-im-absatz-text-und-tags-kombinieren.html)

GHorn 31. Mai 2011 10:18

XML: Im Absatz Text und Tags kombinieren
 
Hallo,

ich komme bei folgendem Problem trotz ausgiebiger INet-Suche einfach nicht weiter:

In einem Textabsatz sollen Texte und Tags kombiniert werden. Hintergrund: ein Tool liest das XML-File und interpretiert die Tags wie in diesem Fremdprogramm konfiguriert.

Beispiel der XML-Datei:
Code:
  <?xml version="1.0" encoding="UTF-8" ?>
  <body>
    <p>
      Dies ist normaler Text
      <bold>und dies wird als Fettschrift interpretiert</bold>
      und hier gehts wieder normal weiter
    </p>
  </body>
Das Fremdprogramm liest den Absatz <p>..</p> interpretiert den Tag <bold> als "schreibe den nachfolgenden Text in Fettschrift bis </bold> kommt" und macht danach in normaler Schrift weiter. Dieses Verhalten wird im Fremdprogramm definiert.

Mein Ansatz dazu ist:
Delphi-Quellcode:
procedure TForm1.Btn_CreateClick(Sender: TObject);
var
  My_XML: IXMLDocument;
  n1, n2, n3: IXMLNode;
  sCellVal: string:
begin
  My_XML := NewXMLDocument('1.0');
  My_XML.Active := True;
  My_XML.ChildNodes.Clear;
  My_XML.Encoding  := 'UTF-8';
  n1 := My_XML.AddChild('body');
  n2 := n1.AddChild('start');
  n3 := n2.AddChild('p');       // Neuer Absatz bzw. zusammengehöriger Text
  s := 'Dies ist normaler Text ';
  s := s + '<bold>und dies wird als Fettschrift interpretiert</bold> ';
  s := s + 'und hier gehts wieder normal weiter.';
  n3.Text := s;
  My_XML.SaveToFile('Test.xml');
end;
... und das funktioniert nicht. Die Tags <bold> und </bold> werden als Text und nicht als Tag sowohl vom IE als auch vom Fremdprogramm interpretiert und alles erscheint (schlecht lesbar) in einer langen Zeile in diesem Absatz.


Fragen:
1) Wie setze ich die Zeilenumbrüche (bessere Lesbarkeit)? Ein "#13#10"
reicht offensichtlich nicht. Jedenfalls werden sie im IE nicht ausgeführt.
2) Was muss ich machen, dass die Tags (im obigen Beispiel <bold> </bold> auch
als solche erkannt werden. Der IE ignoriert sie einfach und das lesende
Tool kann damit auch nix anfangen. Sie werden schlicht als Text interpretiert.

Besten Dank vorab für eure Hilfe!
Gerald

Coffeecoder 31. Mai 2011 12:12

AW: XML: Im Absatz Text und Tags kombinieren
 
Hi,

Zitat:

Zitat von GHorn (Beitrag 1103881)
1) Wie setze ich die Zeilenumbrüche (bessere Lesbarkeit)? Ein "#13#10"
reicht offensichtlich nicht. Jedenfalls werden sie im IE nicht ausgeführt.

Hast du schon mit einem "<br>-Tag" versucht anstelle #13#10?

himitsu 31. Mai 2011 12:38

AW: XML: Im Absatz Text und Tags kombinieren
 
Zitat:

'text<bold>text'
tja, das geht so nicht.

Du mußt diesen String schon zerlegen und mußt dann alle einzelnen Elemente einzeln übergeben.

Tipp/Versuch:
Delphi-Quellcode:
Temp.XML := '<root>' + S + '</root>'; // oder Temp.LoadXML('<root>' + S + '</root>');
n3.ChildNodes.AddNodes(Temp.RootNode.ChildNodes);
Bei den Methoden mußt'e aber mal schauen, wie die wirklich heißen. (ist jetzt mehr ein Pseudobeispiel)



PS: Das was du schreiben möchtest, ist kein reinrassiges XML. (einen Text ohne umschließenden Node gibt es nicht)
Darum wird in XHTML der Text oftmals in <p>'s oder <span>'s eingeschlossen, damit er irgendwo drin ist.

Also kann es gut sein, daß deine verwendete XML-Lib einer derartige Verschachtelung nicht zuläßt.

PPS: Für die Browser ist ein Zeilenumbruch im "Quelltext" kein Zeilenumbruch in der Anzeige.
In der Anzeige werden jeweils mehrere Leerzeichen, Zeilenumbrüche und Tabs als 1 Leerzeichen angezeigt. (außer in bestimmten CODE-Tags, wo dieses anders definiert ist).
Standardmäßig ist ein Zeilenumbruch für die Anzeige das <BR>-Tag (ein Umbruch "BReak" in der Zeile), welcher in XML eigentlich ein <BR/> ist, da es keine offenen Tags Nodes gibt.



Also entweder du hälst dich an die Regeln des XML/XHTML oder du mußt eine HTML-Lib verwenden.

Namenloser 31. Mai 2011 12:41

AW: XML: Im Absatz Text und Tags kombinieren
 
Die „Tags“ werden als Text interpretiert, weil sie Text sind (die spitzen Klammern werden mit &gt; und &lt; kodiert, was du sehen müsstest, wenn du die XML-Datei mit Notepad o.ä. öffnest). Wenn du einen <bold>-Tag hinzufügen willst, musst du das genau so machen wie bei <body>, <start> usw.

Wenn du das so machst, stößt du natürlich auf das Problem, dass du nicht vor und nach dem Tag, sozusagen in der selben „Ebene“, Text haben kannst. Das liegt ganz einfach daran, dass dies in XML nicht vorgesehen ist. In XML hat ein Knoten immer entweder Text als Inhalt oder weitere Kind-Knoten. Mit einem XML-Parser kommst du hier also nicht weiter. Oder du müsstest schauen, dass du den Text irgendwie anders verpackst, z.B. so:
Code:
<p>
  <span>Ich bin eine</span>
  <bold>Banane</bold>
  <span>und gelb</span>
</p>
Wenn das nicht geht, brauchst du einen SGML- bzw. HTML-Parser. Windows bringt bereits einen mit: IHTMLDocument2.

blackfin 31. Mai 2011 12:51

AW: XML: Im Absatz Text und Tags kombinieren
 
Wie soll er das auch "richtig" ausgeben?
Du schreibst eine normale XML-Datei, willst aber (X?)HTML anzeigen?

Ausserdem ist <bold> kein Standardkonformer Tag zur Fettschrift für Browser, sondern <b>.

Für sowas bräuchtest du ein eigenes XSD (XML Schema), beziehungsweise eher ein zugehöriges XLS-Stylesheet und einen XSLT-fähigen Browser, das ist aber ein ganz anderes Thema.

Ausserdem verschachtelst du Tags innerhalb von Text, somit müsste der ganze body-Abschnitt eigentlich als CDATA deklariert sein, um XML-konform zu bleiben.


Wieso gibst du das ganze nicht einfach mit einem entsprechenden, validen Doctype als HTML aus?

shmia 31. Mai 2011 13:08

AW: XML: Im Absatz Text und Tags kombinieren
 
Du solltest ein Element und nicht einfach nur ein Child bzw. Node anhängen.
Das ist ein Unterschied.
Das DOM betrachtet alles zunächst mal als Knoten (Node).
Es gibt aber unterschiedliche Nodetypen; das ist insbesondere beim Schreiben wichtig, den richtigen Nodetyp zu verwenden.

GHorn 31. Mai 2011 13:40

AW: XML: Im Absatz Text und Tags kombinieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke für vielen Antworten!

@blackfin: Das ist das, was ich versucht habe zu erklären. Das
fremde Auswertetool erkennt diesen Tag und reagiert entsprechend. Der Text soll nicht "direkt" fett angezeigt werden.

Zum besseren Verständnis und zum "Beweis, dass es doch irgenwie zu gehen scheint :shock: " habe ich ein Beispiel angehängt, das ich mit dem IE geöffnet habe. Ich kapiere nicht, wie das funktioniert. In dem Beispiel
steht nicht <bold> sondern <strong>. In dem Fremdtool kann ich nun hinter diesem Schlüsseltag irgendeine Aktion hinterlegen. Z.B. Fettdruck, kursiv oder hochgestellt usw.

Die übrigen Antworten werde ich jetzt abarbeiten. U.U. bringen die mich ja noch auf das richtige Gleis...
Danke.

Namenloser 31. Mai 2011 13:48

AW: XML: Im Absatz Text und Tags kombinieren
 
Browser sind Fehlern gegenüber relativ tolerant und stellen einiges dar, was eigentlich nach dem Standard nicht gültig wäre – wer will schon einen Browser, der beim kleinsten Markup-Fehler bereits aufgibt und gar nichts mehr anzeigt? In den meisten anderen Programme führen solche Fehler aber zum Abbruch des Parsingvorgangs.

blackfin 31. Mai 2011 13:53

AW: XML: Im Absatz Text und Tags kombinieren
 
Hm...also, wenn das Ding so aussieht, dann bleibt dir glaube ich nur eine Möglichkeit: Parse / zerlege den body-Text selbst über reguläre Ausdrücke anhand der Tags und setz es dann wieder dementsprechend zusammen.

blackfin 31. Mai 2011 13:55

AW: XML: Im Absatz Text und Tags kombinieren
 
Code:
In den meisten anderen Programme führen solche Fehler aber zum Abbruch des Parsingvorgangs
Wenn man den Text, der auch Tags enthält in ein <![CDATA[.....]]> packt, dürfte sich das auch ohne Parser-Fehler vom XML-Parser parsen lassen. (Was für ein Satz..)
Nur muss man dann den CDATA-Inhalt selbst (über regular expressions o.Ä) auswerten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:49 Uhr.
Seite 1 von 2  1 2      

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