Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XMLNode innerxml - Markup zuweisen (https://www.delphipraxis.net/118612-xmlnode-innerxml-markup-zuweisen.html)

s-w 11. Aug 2008 14:54


XMLNode innerxml - Markup zuweisen
 
Hallo,
gibt es eine Möglichkeit einem XMLNode sowas wie dem InnerXml zu setzen?
Ich benutze MSXML2_TLB. In C# gibt es da node.innerxml wo man dem knoten xml strukturen zuweisen kann, der dann auch über den DOM ansprechen angesprochen werden kann. Es gibt leider nur Node.XML, aber diese Property ist enthält keine Möglichkeit XML zuzuweisen.

Hier ein kleines Beispiel, das verdeutlicht was ich machen möchte
Delphi-Quellcode:
<?xml version="1.0" encoding="utf-8"?>
<Gebaeude>

</Gebaeude>
Nach dem Ändern soll das so aussehen
Delphi-Quellcode:
<?xml version="1.0" encoding="utf-8"?>
<Gebaeude>
       <Wohn-Haus>
             <StandardHaus id="1" attr1="value1" attr2="value2" ..../>
             <StandardHaus id="2" attr1="value1" attr2="value2" ..../>
       </Wohn-Haus>
       <Fabrik>
             <Metallfabrik id="1" attr1="value1" attr2="value2" ..../>
       </Fabrik>
</Gebaeude>
Das Problem ist, das mit das ganze als string vorliegt, und ich diesen erst per hand auseinander nehmen müsste, um Nodes mit Attributen zu erzeugen, die ich dem Node "Gebaeude" anhängen könnte. Gibt es eine andere Möglichkeit - sprich sowas wie "innerxml" in C#?

Danke
Gruß
Sven

marabu 11. Aug 2008 15:53

Re: XMLNode innerxml - Markup zuweisen
 
Herzlich willkommen in der Delphi-PRAXiS, Sven.

Leider hast du mit MSXML2 nur eine Möglichkeit markup zu parsen. Es ist aber nicht so sehr ein Unterschied zwischen C# und Delphi, als vielmehr zwischen .NET und Win32. Unter Win32 mit Version 4 des XML-Parsers würde ich etwa so vorgehen:

Delphi-Quellcode:
function JoinDocuments(masterDoc, doc: IXMLDOMDocument2): Boolean;
var
  i: Integer;
begin
  Result := masterDoc.documentElement.tagName = doc.documentElement.tagName;
  if Result then
    for i := 0 to Pred(doc.childNodes.length) do
      masterDoc.documentElement.appendChild(doc.documentElement.childNodes.item[i].cloneNode(True));
end;
Freundliche Grüße

s-w 11. Aug 2008 16:04

Re: XMLNode innerxml - Markup zuweisen
 
Hi
danke schonmal für die Antwort. Aber so wie ich das sehe, bist du davon ausgegangen das die 2. XML Struktur auch vorliegt. Ich habe aber das, was an den Knoten angehängt werden soll, nur als String vorliegen.

Delphi-Quellcode:
strTmpm := "<Wohn-Haus><StandardHaus id="1" attr1="value1" attr2="value2" ..../><StandardHaus id="2" attr1="value1" attr2="value2" ..../></Wohn-Haus><Fabrik><Metallfabrik id="1" attr1="value1" attr2="value2" ..../></Fabrik>"
Muss ich den String händich zerflücken und mir die Nodes und Attribute incl. Values erstellen?

Gruß

DGL-luke 11. Aug 2008 16:17

Re: XMLNode innerxml - Markup zuweisen
 
das einzige was dir fehlt ist doch der header und der footer von xml. pack das doch einfach dazu? oder variiert das?

himitsu 11. Aug 2008 16:47

Re: XMLNode innerxml - Markup zuweisen
 
DGL-luke meint, erstell dir eine neue temporäre XML-Komponente, pack dort deinen String rein und kopier dir von dort den Inhalt (z.B. wie oben beschrieben).

und eventuell noch Header und Footer dazu
Code:
'<?xml version="1.0" encoding="utf-8"?><Gebaeude>' + S + '</Gebaeude>'

marabu 11. Aug 2008 17:43

Re: XMLNode innerxml - Markup zuweisen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Sven,

Zitat:

Zitat von s-w
... so wie ich das sehe, bist du davon ausgegangen das die 2. XML Struktur auch vorliegt. Ich habe aber das, was an den Knoten angehängt werden soll, nur als String vorliegen. ...

ich hatte vorausgesetzt, dass du schon weißt, wie man einen markup string in ein Dokument verwandelt. Das Beispiel im Anhang zeigt dir, wie du das stilecht hinbekommst.

Freundliche Grüße


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