![]() |
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:
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.
<?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> Mein Ansatz dazu ist:
Delphi-Quellcode:
... 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.
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; 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 |
AW: XML: Im Absatz Text und Tags kombinieren
Hi,
Zitat:
|
AW: XML: Im Absatz Text und Tags kombinieren
Zitat:
Du mußt diesen String schon zerlegen und mußt dann alle einzelnen Elemente einzeln übergeben. Tipp/Versuch:
Delphi-Quellcode:
Bei den Methoden mußt'e aber mal schauen, wie die wirklich heißen. (ist jetzt mehr ein Pseudobeispiel)
Temp.XML := '<root>' + S + '</root>'; // oder Temp.LoadXML('<root>' + S + '</root>');
n3.ChildNodes.AddNodes(Temp.RootNode.ChildNodes); 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. |
AW: XML: Im Absatz Text und Tags kombinieren
Die „Tags“ werden als Text interpretiert, weil sie Text sind (die spitzen Klammern werden mit > und < 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:
Wenn das nicht geht, brauchst du einen SGML- bzw. HTML-Parser. Windows bringt bereits einen mit:
<p>
<span>Ich bin eine</span> <bold>Banane</bold> <span>und gelb</span> </p> ![]() |
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 ( ![]() 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? |
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. |
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. |
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.
|
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.
|
AW: XML: Im Absatz Text und Tags kombinieren
Code:
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..)
In den meisten anderen Programme führen solche Fehler aber zum Abbruch des Parsingvorgangs
Nur muss man dann den CDATA-Inhalt selbst (über regular expressions o.Ä) auswerten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:17 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