![]() |
mit Delphi ein Word XML Dokument verarbeiten
Hallo,
ich habe gerade erst angefangen, mich im Umgang mit XML zu beschäftigen, deshalb kann die eine oder andere Frage recht blöd sein. Ich möchte ein XML Dokument erstellen, um dort über verschiedene Elemente (in der XML Datei unten z.B. Name und Beruf) an deren Werte zu gelangen. Platzhalter in der XML Datei sollen dann von Benutzern gefüllt werden und später möchte ich sie eben wieder auslesen können. Hier mal das Dokument, wie es per Hand erstellt wurde:
Delphi-Quellcode:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?mso-application progid="Word.Document"?> <w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument "> <w:docPr> <w:showXMLTags w:val="on"/> <w:view w:val="page"/> <w:alwaysShowPlaceholderText w:val="on"/> </w:docPr> <w:body> <w:p> <w:r> <w:rPr> <w:b/> </w:rPr> <w:t xml:space="preserve">Name: </w:t> </w:r> <s:name> <w:r> <w:t>Hans</w:t> </w:r> </s:name> </w:p> <w:p> <w:r> <w:rPr> <w:b/> </w:rPr> <w:t xml:space="preserve">Beruf: </w:t> </w:r> <s:beruf> <w:r> <w:t>Pilot</w:t> </w:r> </s:beruf> </w:p> </w:body> </w:wordDocument> Das funktioniert leider nicht alles nicht so richtig (: daher einige Fragen: 1) Beim abspeichern des XML Dokuments via Word verändert sich dessen Struktur bzw. Word fügt 100 Millionen Attribute, usw. hinzu. Das ist erst einmal gar nicht unbedingt schlimm, da die Platzhalter (bspw. Name / Beruf) trotzdem erhalten bleiben. Kann man die eigene Struktur dennoch irgendwie beibehalten? 2) Wenn die Platzhalter gefüllt sind und ich die Werte auslesen möchte, wie stelle ich das am besten an? Ich habe versucht das XML Dokument per IXmlDocument auslesen und an die Platzhalter zu kommen, was aber nicht so richtig funktionierte. Ich habs folgendermaßen versucht:
Delphi-Quellcode:
Wenn man sich die Knotennamen ausgibt, dann kommt da der Node 'Beruf' gar nicht vor. Vermutlich nicht, weil er in der Hierarchie noch weiter verschachtelt ist. Bevor ich jetzt aber mit einem falschen Ansatz weiter mache, wollte ich euch fragen, wie ich am Besten an meine selbstdefinierten Platzhalter (in diesem Fall Beruf / Name) komme.
xmlDoc := LoadXmlDocument('e:\_entwicklung\3.xml');
for i := 0 to Pred(xmldoc.DocumentElement.ChildNodes.Count) do begin if xmldoc.DocumentElement.ChildNodes[i].NodeName = 'Beruf' then begin ShowMessage(VarToStr(xmldoc.DocumentElement.ChildNodes[i].NodeValue)) end; end; 3) Wenn man das XML Dokument oben in Wort öffnet, sollte man Platzhalter sehen. Kann ich in Word den Namen dieser Platzhalter ändern? Dazu habe ich bisher noch keine Möglichkeit gefunden. Vielen Dank für eure Hilfe :) |
Re: mit Delphi ein Word XML Dokument verarbeiten
Zitat:
Wenn du mit Struktur deine Einrückungen und Zeilenumbrüche in der XML-Datei meinst: die kannst du vergessen und benötigt sie auch nicht, wenn du nicht einen normalen Editor, sondern einen auf XML spezialisierten Editor (z.B. ![]() Zitat:
![]() ![]() Mit XPath kannst du dir Daten aus der Tiefe der XML-Strukturen rausziehen, ohne die ganzen Knoten nach unten gehen zu müssen. Zitat:
|
Re: mit Delphi ein Word XML Dokument verarbeiten
Zitat:
Zitat:
Zitat:
|
Re: mit Delphi ein Word XML Dokument verarbeiten
Hallo nalii,
dein mit einem beliebigen Editor manuell erstelltes XML-Dokument mag zwar nach WordProcessingML aussehen, mehr aber auch nicht. Willst du ein solches Dokument als Template hinterlegen, dann ist es das einfachste, wenn du es mit MSWord entwirfst. Zu deinen Fragen: (1) Störe dich einfach nicht daran. Es ist das Speicherformat von MSWord, nicht deines. Dass deine tagnames dem namespace ns1 zugeschlagen werden, liegt wahrscheinlich daran, dass du tags verwendet hast, welche im jeweiligen namespace nicht definiert sind, z.B. s:name. (2) PlaceholderText ist ein Attribut, dessen Wert an Stelle eines Defaults angezeigt wird, damit der Bearbeiter des Dokuments sich trotz leerer Textelemente irgendwie orientieren kann. Für die programmgesteuerte Manipulation eines XML-Dokuments ist PlaceholderText eher ungeeignet, da dieser Text mitunter zu oft vorkommt. (3) Den PlaceholderText solltest du in der XML-Ansicht von MSWord einstellen können. Warum arbeitest du nicht einfach mit Feldern? Die sind in MSWord eigentlich genau für deine Zwecke vorgesehen. Grüße vom marabu |
Re: mit Delphi ein Word XML Dokument verarbeiten
Zitat:
Magst du das mit den Feldern ein bisschen genauer erlären? Der Vorteil des XML Dokuments war ja, dass es nicht kodiert ist und ich meine Knoten und Elemente ansprechen kann über Delphi Komponenten. Kann ich Felder denn auch programmatisch ueber Delphi ansprechen bzw. kann ich Felder in einem XML Dokument verwenden? |
Re: mit Delphi ein Word XML Dokument verarbeiten
Erstelle dir mit MSWord ein Dokument, füge ein paar Felder hinzu (Einfügen:Feld o.ä.) und speichere es als XML-Dokument ab. Dein Dokument kannst du dann hier als Basis für weitere Fragen und Hilfestellungen anhängen. Ich sitze heute vor einer Maschine, auf der leider kein MSWord installiert ist.
|
Re: mit Delphi ein Word XML Dokument verarbeiten
Ich bin inzwischen soweit, dass ich ein wunderbares XML Dokument mit customXML habe. Nun will ichs auslesen.
Hier ein kurzer Auszug (nochmal gekürzt):
Delphi-Quellcode:
ContactName heißt das Element und ich will ganz gern an dessen Inhalt :) (in diesem Fall <w:t>test</w:t>). Wie komm ich daran?
<w:customXml w:uri="http://www.blubb.de" w:element="ContactName">
<w:tc> <w:p> <w:r> <w:t>test</w:t> </w:r> </w:p> </w:tc> </w:customXml> Ich habe folgendes versucht:
Delphi-Quellcode:
Aaaaaber da kommt nichts... mit // müsste ich eigentlich das ganze Dokument nach dem Element durchsuchen. Trotzdem wird nichts gefunden.
var
xmlDoc : IXMLDOMDocument; root : IXMLDOMElement; node : IXMLDOMNode; begin xmlDoc := CoDOMDocument.Create; xmldoc.load('e:\blubb.xml'); root := xmlDoc.DocumentElement; node := root.selectSingleNode('//ContactName'); if Assigned(node) then ShowMessage(node.text); |
Re: mit Delphi ein Word XML Dokument verarbeiten
Du hast XPath noch nicht ganz verstanden. Das, was du da machst, selektiert einen Tag namens ContactName, also <ContactName>.
Schau dir am besten folgendes Tutorial an, das ist wirklich super und leicht zu verstehen: ![]() Beispiel Nr. 6 entspricht dann ungefähr dem, was du brauchst. |
Re: mit Delphi ein Word XML Dokument verarbeiten
Zitat:
In Beispiel 6 werden die Attribute eines Elements ausgelesen, aber in meinem Beispiel (zwei Posts weiter oben) sind die Informationen, die ich brauche, gar nicht in Attributen gespeichert, sondern in bzw. zwischen Elementen (<w:t>). Weil aber <w:t> in einem Office XML Dokument 100 Millionen Mal vorkommt, brauche ich das customXML Element, dem ich einen Namen geben kann. Mh... und dann muss ich mich von da aus wohl durch die Knoten bis zum <w:t> hangeln. Das Tutorial ist aber trotzdem sehr gut. Ich werde da noch einmal herumprobieren. Vielen Dank :) |
Re: mit Delphi ein Word XML Dokument verarbeiten
Lies dir bitte das Tutorial NOCHMAL gründlich von vorne bis hinten durch!
Du hast es nämlich immer noch nicht verstanden :D Beispiel 6 ist EXAKT das was du benötigst! Damit wählst du jenen Knoten aus, welcher jenes Attribut mit jenem Wert hat. Das, woran du letzendlich ran kommen willst, ist dann ja nur noch ein Unterknoten von dem gefundenen Knoten. Eine Variante, die du nehmen könntest wäre die hier:
Code:
Das ist aber natürlich nicht sicher!!! Da die XML-Datei ja nicht zwangsläufig so aufgebaut sein muss und es auch mehrere Tags mit diesen Eigenschaften geben könnte.
//w:customXml[@w:element='ContactName']/w:tc/w:r/w:t
Also schau dir das Tutorial noch mal in Ruhe an und probiere am besten jedes Beispiel mit irgendeiner Beispiel-XML-Datei mal durch. Danach hat man es eigentlich verstanden, da es sehr leicht zu verstehen ist. Wenn man aber noch nie mit Xpath gearbeitet hat, kann man natürlich nicht nur mal eben nachschauen, was man für sich braucht und es dann eben einbauen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 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