Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi MSXML DTD in XML Datei einfügen (https://www.delphipraxis.net/114961-msxml-dtd-xml-datei-einfuegen.html)

jacobi1880 3. Jun 2008 15:49


MSXML DTD in XML Datei einfügen
 
Hallo zusammen,

bin neue in diesen Forum und habe gleich eine Frage.

Wie kann ich DTD-Zeile in eine neu erstellte XML-Datei einfügen?

Ich arbeite mit RAD Studio 2007 und MSXML.

Meine XML-Dateien habe ich bereits erstellt, mir fehlt noch DTD.

Ich habe viele Beiträge in diesen Forum gelesen und viele nutzlilche Tipps
gefunden und benutzt.
In google habe ich auch gesucht,
aber ich komme nicht weiter und hoffe, dass Ihr mir helfen könnt.

So erstelle ich meine XML-Datei:
Delphi-Quellcode:
var
  rootnode          : XMLIntf.IXmlNode;
  ChildNode         : XMLIntf.IXmlNode;
begin
  xmlLDoc := XMLDoc.TXmlDocument.Create(nil);
  xmlDoc.ParseOptions := [];
  xmlDoc.Active      := true;
  xmlDoc.Version     := '1.0';
  xmlDoc.Encoding := 'iso-8859-1';
  xmlDoc.NodeIndentStr := ' ';
  xmlDoc.Options := [doNodeAutoIndent];

  try
    rootnode := FXMLDoc.CreateElement('TT', '');
    xmlDoc.DocumentElement := rootnode;

    ChildNode := AddNode(xmlDoc, rootnode, ntElement, 'version', '');
    ChildNode.Attributes['number'] := '10';
  usw.
-------------------------------------------------

function TXMLData.AddNode(aXMLDoc: XMLDoc.TXMLDocument;
  aParent: XMLIntf.IXmlNode; NodeType: XMLIntf.TNodeType; sNodename,
  sNodeText: String): XMLIntf.IXmlNode;
begin
  Result := xmlDoc.CreateNode(sNodename, NodeType);

  if Trim(sNodeText) <> '' then
  begin
    case NodeType of
      ntElement: Result.Text := sNodeText;
      ntDocType: Result.Text := sNodeText;
    end;
  end;

  if aParent <> nil then
    aParent.ChildNodes.Add(Result)
  else
    xmlDoc.ChildNodes.Add(Result);
end;
wenn ich die Funktion AddNode mit 'ntDocType' zum einfügegn der DTD nutze gibt es
keine Fehlermeldung, die Zeile wird aber in XML-Datei nicht angezeigt.


MfG

jacobi1880

shmia 3. Jun 2008 17:47

Re: MSXML DTD in XML Datei einfügen
 
Ich kenne auch nur folgende nicht sehr schöne Lösung:
Delphi-Quellcode:
document.loadXML('<?xml version="1.0" encoding="UTF-8" standalone="no"?>'#13#10+
   '<!DOCTYPE RootElement SYSTEM "BLA_BLA_XML.DTD">'#13#10+
   '<RootElement/>'#13#10);
Das Wurzelelement muss oben schon mitgeladen werden, sonst wäre es kein gültiges XML-Dokument.
Die Zeilenumbrüche mit #13#10 kann man auch weglassen.

marabu 3. Jun 2008 18:21

Re: MSXML DTD in XML Datei einfügen
 
Herzlich willkommen in der Delphi-PRAXiS, jacobi1880.

andere XML DOM Lieferanten mögen das tun, aber MSXML lässt nicht zu, dass CreateNode() für den Knotentyp NODE_DOCUMENT_TYPE aufgerufen wird.

MS Windows Platform SDK
... You cannot create a node of type NODE_DOCUMENT, NODE_DOCUMENT_TYPE, NODE_ENTITY, or NODE_NOTATION. ...

Ein DOCTYPE-Knoten muss also bereits an den DOM-Parser übergeben werden - ob das nun schön oder unschön ist.

Freundliche Grüße

jacobi1880 4. Jun 2008 09:57

Re: MSXML DTD in XML Datei einfügen
 
Vielen Dank für Eure Antworten,

unsaubere Methode ist mir bekannt, aber ich würde sehr gerne wissen
wie ich das mit 'saubere Methode' machen könnte.

Zitat:

Ein DOCTYPE-Knoten muss also bereits an den DOM-Parser übergeben werden - ob das nun schön oder unschön ist.
Ich arbeite mit folgenden Units: 'XMLDoc, XMLIntf, MSXMLDom'.
Habe noch einmal versucht aber es klappt nicht, wenn ich das nicht mit CreateNode() machen kann, wie füge ich den
DOCTYPE-Knoten in meine XML-Datei? :wall:

Für ein Tipp wäre ich sehr dankbar.

MfG

jacobi1880

marabu 4. Jun 2008 19:54

Re: MSXML DTD in XML Datei einfügen
 
Hallo,

die von Andreas in Beitrag #2 gezeigte Lösung ist nicht unsauber: Solange du mit MSXML als DOM Vendor arbeitest, hast du keine andere Möglichkeit.

Unter uns Ordensschwestern: Warum willst du die DTD unbedingt nachträglich an ein Dokument dranfummeln?

Freundliche Grüße

jacobi1880 5. Jun 2008 08:32

Re: MSXML DTD in XML Datei einfügen
 
Hai,

meine XML-Dateien werden per FTP auf ein Server hochgeladen und dort werden sie von einem
Parser validiert. Die DTD-Zeile verweist auf eine externe DTD-Datei und muss in jeder XML-Datei vorhanden sein.

Dem zu folgen habe ich drei Möglichkeiten dieses Problem zu lösen.

1. Die XML-Datein werden als Templates in einer Datenbank gespeichert, diese Templates beinhalten
den DTD-Verweis. Die Dateien werden aus der Datenbank geladen, validiert und mit Werten befühlt.
Diese Lösung ist bereits fertig.

2. Die XML-Dateien werden direkt im Quelltext erstellt und und mit Werten befült und diese Lösung ist auch so
weit fertig, wäre nicht das Problem mit dem DTD-Verweis, abgesehen von 'unsauberen Lösung'.

3. Unter uns Ordenschwestern könnte ich das Ganze mit StringListen lösen, aber das ist keine XML-Verarbeitung
und das mache ich nicht, den wozu hat man einen XML-Parser.

Ich hoffe, dass ich deine Frage beantworten konnte.

PS: Ich habe das Gefühl, ich bin eine der wenigen, der Fragen zur DTD stellt, den in useren Forum gibt es
nur wenige Frage zu diesen Thema.

MfG

jacobi1880

marabu 5. Jun 2008 08:50

Re: MSXML DTD in XML Datei einfügen
 
Moin,

externe Templates sind schon der richtige Weg. Ob es bei dir eine Datenbank zu deren Verwaltung sein muss, kann ich nicht beurteilen. Mir würde das FileSystem genügen.

Die wenigen Fragen zu XML-DTD's dürften damit zusammenhängen, dass dieses SGML-Feature eine Übergangslösung darstellte und für MSXML sofort durch XML-Data (XDR), für den Rest der Welt später durch XML Schema (XSD), abgelöst wurde. Du wirst gute Gründe dafür haben, dass du keine reine XML-Lösung verwendest.

Freundliche Grüße

jacobi1880 5. Jun 2008 10:01

Re: MSXML DTD in XML Datei einfügen
 
Hai,

alles klar und vielen Dank für Unterstutzung.

MFG

jacobi1880


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf