Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi MSXML speichert mit tabs statt mit XMLDocument.NodeIndentStr (https://www.delphipraxis.net/53298-msxml-speichert-mit-tabs-statt-mit-xmldocument-nodeindentstr.html)

hbProgit 13. Sep 2005 20:06


MSXML speichert mit tabs statt mit XMLDocument.NodeIndentStr
 
Hallo Leute,

bitte Nachsicht: habe noch nicht viel mit XML gemacht ... :oops:
Umgebung: D6Pro Update pack2 auf W2KSP4

Das Problem ist folgendes: beim Speichern wird das XML-Dokument immer mit einer TAB-Einrückung formatiert. Es soll aber immer mit 3 Leerzeichen eingerückt werden.

Es wird SaveToFile()zum SPeichern verwendet.

Ich habe im Archiv auch schon dieses gefunden:
======
XMLnode.AppendChild(XMLdoc.CreateTextNode(#13#10#0 9#09));
=======

und:
======
XMLDocument.Options := XMLDocument.Options + [doNodeAutoIndent];
..
Du hast überlesen, dass es um MS-XML 4 geht. Und da gibt´s das nicht.
======
Na ja: die Eigenschaft NodeIndentStr kann sowohl im ObjektInspektor als auch im Source gesetzt werden.
"Und da gibt´s das nicht" scheint wohl richtig zu sein, da auch das Setzen von doNodeAutoIndent:=false keinerlei Wirkung zu zeigen.
Ist es einfacher, OpenXML zu verwenden? Welche Unterschiede - im Wesentlichen - gibt es da?

Das grundlegende Problem mit OpenXML ist, dass ich die Unit "oxmldom" nicht habe :(

Bin für alle Tips dankbar - besonders die, die helfen :-D

Gruß
Helmut

hbProgit 14. Sep 2005 13:35

Re: MSXML speichert mit tabs statt mit XMLDocument.NodeInden
 
Hallo Leute,

nach den vielen Hinweisen hier habe ich erstmal nach dem "Open XML" im Web gesucht - und eine gleichnamige "Komponente" von Dieter Köhler gefunden.
Nach der Installation zeigt sich, dass diese nichts mit der oxmldom.pas von Borland zu tun hat.
Leider komme ich damit erstmal nicht weiter (o.k.: die XDOM lib ist damit schon mal von 2.4 auf 3.1 aktualisiert), wenn ich jetzt nicht das ganze Programm neu schreibe.
Ist aber wohl ein wenig viel Aufwand, NUR weil dieses msxmldom immer tabs als Einrückung verwendet.

Vielleicht kennt sich ja doch noch jemand mit XML aus hier???

Gruß
Helmut

marabu 14. Sep 2005 13:45

Re: MSXML speichert mit tabs statt mit XMLDocument.NodeInden
 
Hallo Helmut,

die Steuerung von white space / indentation in deinem XML-Dokument ist ein haariges Geschäft, das du besser XSL-T überlassen solltest. Die Einrückung ist ja wohl nur für die Ausgabe des raw codes von Interesse. Da möchte ich dann aber schon ein bischen mehr als nur Indentation. Oder hast du eine andere Motivation?

Grüße vom marabu

hbProgit 14. Sep 2005 14:34

Re: MSXML speichert mit tabs statt mit XMLDocument.NodeInden
 
Hallo marabu!

es geht um ein Tool (!) für XML- (nicht XSL)Dateien. Diese werden von einer Anwendung generiert. Da gilt es, nicht an der Formatierung zu wurschteln. Es soll nur eine sichere (!) Option über dieses Tool zum Ändern von einzelnen NodeValues oder NodeAttributes geben.

Jetzt sind die Original-Dateien mit einer Einrückung von je 3 Leerzeichen pro Ebene vorgegeben.

Beim Speichern mit XMLDocument.saveToFile() und der MSXML werden diese Leerzeichen komplett durch tabs ersetzt.

Erste Tests haben gezeigt, dass es der Anwendung keine Probleme bereitet, wenn tabs statt Leerzeichen verwendet werden. Allerdings kann ich das nicht auf allen Systemen testen: die Anwendung ist in Java geschrieben und läuft neben NT auch auf Sun, Aix, Linux, HP.
Früher wurden die Dateien Server-seitig sogar völlig unformatiert geschrieben. Ich denke mal, es wird schon gehen - will aber lieber auf Nummer sicher gehen.

Da die Komponente TXMLDocument ja schon diese Eigenschaft NodeIndentStr hat, fände ich es ganz praktisch, wenn die auch verwendbar wäre.
Die für D6Pro aktualisierte Hilfe dazu sagt jedenfalls nicht, dass diese Eigenschaft nicht bei MSXML verwendet wird.

Gruß
Helmut

marabu 14. Sep 2005 16:53

Re: MSXML speichert mit tabs statt mit XMLDocument.NodeInden
 
Hallo Helmut,

beim MS XML Parser kannst du die TAB substitution so verhindern:

(1) dem documentElement musst du das attribute xml:space="preserve" verpassen:

Code:
<?xml version="1.0" encoding="iso8859-1"?>
<root xml:space="preserve">
...
</root>
(2) vor dem Laden musst du die white space preservation einschalten:

Delphi-Quellcode:
procedure TDemoForm.DemoButtonClick(Sender: TObject);
var
  i: integer;
  doc: IXMLDOMDocument2;
  nl: IXMLDOMNodeList;
  e: IXMLDOMElement;
begin
  doc := CoDomDocument.Create;
  doc.async := false;
  doc.preserveWhiteSpace := true;
  doc.load(XmlEdit.Text);
  nl := doc.SelectNodes('//*');
  for i := 0 to nl.length - 1 do begin
    e := nl.item[i] as IXMLDOMElement;
    e.setAttribute('testattr', 'testvalue');
  end;
  doc.save(XmlEdit.Text);
end;
Zu OpenXML kann vielleicht Bernhard Geyer etwas sagen.

marabu


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