AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

IXMLDOMDocument formatieren

Ein Thema von delphis spassbremse · begonnen am 16. Jul 2009 · letzter Beitrag vom 18. Jul 2009
Antwort Antwort
delphis spassbremse

Registriert seit: 7. Jun 2007
Ort: Enger
104 Beiträge
 
Delphi 7 Enterprise
 
#1

IXMLDOMDocument formatieren

  Alt 16. Jul 2009, 21:19
Hallo,


ich bearbeite mit einem IXMLDOMDocument2 Objekt eine XML Datei.

im Programm füge ich immer neue Nodes hinzu und speicher anschließend das Dokument.

Nur die angehängten Nodes sind in der Datei alle hintereinander gehängt und ist
nicht wirklich gut von Hand zu editieren.

Meine Frage ist nun, ob es ohne großen Aufwand möglich ist die Elemente ordentlich untereinanderzuhängen.

Im Moment siehts so aus:
XML-Code:
<a>
  [b]Content[/b][b]Content[/b][b]Content[/b]</a>
Und so sollte es eigentlich aussehen:
XML-Code:
<a>
  [b]Content[/b]
  [b]Content[/b]
  [b]Content[/b]
</a>
hat da jemand eine Idee das ganze zur Laufzeit unkompliziert zu lösen?
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#2

Re: IXMLDOMDocument formatieren

  Alt 16. Jul 2009, 21:24
Zitat von delphis spassbremse:
Meine Frage ist nun, ob es ohne großen Aufwand möglich ist die Elemente ordentlich untereinanderzuhängen.
Die Funktion FormatXmlData aus der Unit xmldoc ist genau dazu gedacht.

Cheers,
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#3

Re: IXMLDOMDocument formatieren

  Alt 16. Jul 2009, 21:41
XML.Options := [doNodeAutoIndent]; dürfte helfen (zumindestens wenn man die Datei erstellt, bzw. Nodes einfügt ... ich weiß jetzt nicht, ob dieses auch etwas bei vorhandenen Daten etwas bewirkt, wenn man die Datei vorher unformatiert eingelesen hat)

ansonsten vermutlich nach dem Einlesen dieses FormatXmlData aufrufen und weiter diese Option nutzen,
oder einfach vor dem Speichern.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#4

Re: IXMLDOMDocument formatieren

  Alt 16. Jul 2009, 22:02
Hallo,

ich habe da eine eigene Funktion:
Delphi-Quellcode:
procedure Beautify(const XML: IXMLDOMDocument;
  const IndentString: WideString = #9);

  procedure InsertFormattingNode(const Node: IXMLDOMNode;
    const Len, Index: Integer; Break: Boolean = True);
  var
    I: Integer;
    IndentStr: WideString;
  begin
    for I := 1 to Len do
      IndentStr := IndentStr + IndentString;
    if Break then
      IndentStr := SLineBreak + IndentStr;

    InsertTextNode(Node, IndentStr, Index);
  end;

  procedure ProcessList(const Node: IXMLDOMNode);
  var
    I: Integer;
    Nesting: Integer;
  begin
    if not Assigned(Node) then
      Exit;
    I := 0;
    Nesting := GetNesting(Node);
    while I < Node.childNodes.length do
    begin
      if (Node.childNodes[I].nodeType = NODE_ATTRIBUTE) or (Node.childNodes[I].nodeName = '#text') then
      begin
        Inc(I);
        Continue;
      end;

      if I = 0 then
        InsertFormattingNode(Node, Nesting + 1, I)
      else
        InsertFormattingNode(Node, 1, I, False);

      Inc(I, 2);

      InsertFormattingNode(Node, Nesting, I);
      Inc(I);
    end;

    for I := 0 to Node.childNodes.length - 1 do
      ProcessList(Node.childNodes[I]);
  end;

begin
  ProcessList(XML.documentElement);
end;
Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
delphis spassbremse

Registriert seit: 7. Jun 2007
Ort: Enger
104 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: IXMLDOMDocument formatieren

  Alt 17. Jul 2009, 14:59
Wow,

dankeschön für die Hilfreichen Sachen.
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#6

Re: IXMLDOMDocument formatieren

  Alt 18. Jul 2009, 09:16
Hi, ich habe auch das Problem mit dem Formatieren einer XML Datei!

Die Funktion:
Zitat:
XML.Options := [doNodeAutoIndent];
ist bei meinem IXMLDOMDocument, msxml leider nicht vorhanden.

Dann hätte ich die Funktion Beautify ausprobiert.
Da ist jedoch InsertTextNode & GetNesting unbekannt!

Wo sind diese definiert?
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#7

Re: IXMLDOMDocument formatieren

  Alt 18. Jul 2009, 09:45
Hallo,
Zitat von schwa226:
Wo sind diese definiert?
in meiner Unit.
Delphi-Quellcode:
function GetNesting(const Node: IXMLDOMNode): Integer;
var
  Parent: IXMLDOMNode;
begin
  Result := 0;
  Parent := Node.parentNode;
  while Assigned(Parent) and (Parent.nodeType <> NODE_DOCUMENT) do
  begin
    Parent := Parent.parentNode;
    Inc(Result);
  end;
end;

function InsertTextNode(const Parent: IXMLDOMNode;
  const Content: WideString; const Index: Integer = -1): IXMLDOMNode;
var
  XML: IXMLDOMDocument;
begin
  if Assigned(Parent) then
  begin
    XML := Parent.ownerDocument;
    if Assigned(XML) then
    begin
      Result := XML.createTextNode(Content);
      if Index = -1 then
        Parent.appendChild(Result)
      else
        Parent.insertBefore(Result, Parent.childNodes[Index]);
    end else
      Result := nil;
  end else
    Result := nil;
end;
Ich hoffe, jetzt fehlt nichts mehr.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#8

Re: IXMLDOMDocument formatieren

  Alt 18. Jul 2009, 09:48


Funktioniert nun Super!!

Jetzt ist es nicht mehr in einer Wurst...!

Danke!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:55 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