Autor Beitrag
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Sa 24.07.04 19:15 
Hallo,
ich hab ne XML-Datei mit einigen Nodes. Als Textelement eines Nodes kommt ein ziemlich langer Text rein, der evtl. auch XML-Nodes enthalten kann. Diese sollen aber nicht geparst werden, sondern als Teil des Textes behandelt werden, z.B.:
ausblenden Quelltext
1:
<query><command>Test</command><text>Irgendein Test mit XML drin: <query><command>Test</command></query> der nicht geparst werden soll</text></query>					

Beim Auslesen des Nodes soll beim Auslesen des "text"-Nodes "Irgendein Test mit XML drin: <query><command>Test</command></query> der nicht geparst werden soll" rauskommen.

Ich verwende IXMLDocument bzw. den OpenXML-Parser, muss unter beidem laufen.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 24.07.04 19:27 
Das müsste IMHO am einfachsten mit "CDATA" gehen:
ausblenden Quelltext
1:
<![CDATA[ <query><command>Test</command></query> ]]>					
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Sa 24.07.04 19:33 
OK, gibt es irgendwelche Zeichenkombinationen, die einen CDATA-Abschnitt noch beenden können, außer ]]> ?
Das Problem ist, dass ich wirklich dafür sorgen muss, dass alles reingeschrieben werden kann, was der User will, auch bei längeren Texte. Wenn ich dann nur noch das dieser Zeichenkombination schauen müsste, ginge das noch... kannst Du mir noch ein Beispiel geben, wie CDATA-Abschnitte in IXML verwendet werden?
mirage228
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 338

Win 7 Prof.
Delphi 2005 Prof., Delphi 2010 Prof.
BeitragVerfasst: Sa 24.07.04 19:34 
Hi,

imho geht das auch, in dem du für die "<" und ">" die HTML Codes &lt; und &gt; einsetzt.

mfG
mirage228

_________________
May the source be with you, stranger.
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Sa 24.07.04 19:40 
Die Frage ist danach nur, welche anderen Kombinationen den Parser iritieren. Außerdem will ich mich nicht durch den ganzen Text hangeln und Zeug ersetzen. Je mehr an etwas gearbeitet werden muss, desto mehr Fehler schleichen sich ein. Ich will das einfach haben und das CDATA scheint mir im Moment das vernünftigste dafür zu sein. Trotzdem danke für den Tipp.
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Sa 24.07.04 19:44 
UGrohne hat folgendes geschrieben:
OK, gibt es irgendwelche Zeichenkombinationen, die einen CDATA-Abschnitt noch beenden können, außer ]]> ?

Laut SelfHTML gibts keine weiteren Zeichenkombinationen zum Beenden eines CDATA-Abschnitts: de.selfhtml.org/xml/...ln/zeichen.htm#cdata

raziel

_________________
JSXGraph
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 24.07.04 20:30 
UGrohne hat folgendes geschrieben:
kannst Du mir noch ein Beispiel geben, wie CDATA-Abschnitte in IXML verwendet werden?

Meinst du erstellen? Das würde bspw. so aussehen (um bei deinem Beispiel von oben zu bleiben ;))
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
procedure TForm1.Button1Click(Sender: TObject);
var
  xmldoc : DomDocument40; // MS XML 4
  text1  : IXMLDOMText;
  cdata  : IXMLDOMCDATASection;
  text   : IXMLDOMNode;
begin
  xmldoc := CoDomDocument40.Create;
  if(xmldoc <> nilthen
  try
    xmldoc.loadXML('<query><command>Test</command><text/></query>');

    if(xmldoc.parseError.errorCode = 0then
    begin
      text  := xmldoc.selectSingleNode('/query/text');

      if(text <> nilthen
      begin
        text1 := xmldoc.createTextNode('Irgendein Test mit XML drin:');
        if(text1 <> nilthen text.appendChild(text1);

        cdata := xmldoc.createCDATASection(
          '<query><command>Test</command></query>');
        if(cdata <> nilthen text.appendChild(cdata);

        text1 := xmldoc.createTextNode('der nicht geparst werden soll');
        if(text1 <> nilthen text.appendChild(text1);
      end;

      ShowMessage(xmldoc.xml);
    end;
  finally
    xmldoc := nil;
  end;
end;
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: So 25.07.04 21:32 
OK, danke für den Tipp, werde ich demnächst mal ausprobieren. Aber das Beste wird sein, wenn ich den ganzen Text in eine CDATA-Section packe... Jetzt muss ich das dann später nur noch in OpenXML hinrkiegen und in meinen Wrapper einbauen. Aber das Code-Fragment hilft schonmal weiter ;-)
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Di 27.07.04 17:40 
Es gibt da noch ein Problem: Ich verwende die Unit XMLIntf und nicht msxml, wo IXMLDOMCDATASection deklariert ist. Einbinden von msxml ist leider auch nicht möglich, da sich dann der in beiden Units vorhandene Typ IXMLDocument beißt.

Bisher hab ich leider mit XMLIntf noch keine Möglichkeit gefunden, CDATA-Sections zu erzeugen. Gibt es da eine Möglichkeit?
BattleFrog
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 53

WIN 2000
Delphi 7 Ent.
BeitragVerfasst: Fr 27.01.06 12:01 
user profile iconUGrohne hat folgendes geschrieben:

Bisher hab ich leider mit XMLIntf noch keine Möglichkeit gefunden, CDATA-Sections zu erzeugen. Gibt es da eine Möglichkeit?


Der Thread ist zwar alt, aber solange er in der Suche auftaucht, werden leute die das Problem haben (so wie ich), ihn finden.

So erzeugt man einen CData Knoten und füllt ihn mit Text (ein Beispiel):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
uses 
  XMLIntf;

var
  XMLDocument: IMXLDocument;
  RootNode, Node, CDataNode: IXMLNode;

begin
  // XML Dokument erstellen
  XMLDocument:= NewXMLDocument();
  XMLDocument.Encoding := 'ISO-8859-1'// damit deutsche Umlaute im XML auch funktionieren
  XMLDocument.Active := true;

  RootNode := XMLDocument.AddChild('WurzelKnoten')
  Node := RootNode.AddChild('Knoten');

  // Hier wird der CData Knoten erstellt
  CDataNode:= XMLResponseData.CreateNode('beliebige Daten', ntCData);
  // Den Knoten in das XML Dokument packen
  Node.ChildNodes.Add(CDataNode);

end;


XML:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
<?xml version="1.0" encoding="ISO-8859-1"?>
<WurzelKnoten>
  <Knoten>
    <![CDATA[beliebige Daten]]>
  </Knoten>
</WurzelKnoten>
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Fr 27.01.06 22:33 
:lol: Da verwende ich jetzt seit fast eineinhalb Jahren XDOM mit meiner Wrapper-Klasse um unter anderem dieses Problem zu umgehen und dann kommst Du daher und machst mir eines meiner Argumente gegen TXMLDocument zunichte :mrgreen:

Danke trotzdem ;-)