Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi mit Delphi ein Word XML Dokument verarbeiten (https://www.delphipraxis.net/112201-mit-delphi-ein-word-xml-dokument-verarbeiten.html)

nalii 16. Apr 2008 16:32


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:
  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;
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.

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 :)

shmia 16. Apr 2008 17:14

Re: mit Delphi ein Word XML Dokument verarbeiten
 
Zitat:

Zitat von nalii
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?

Da bist du nicht der Erste den das stört.
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. http://www.wmhelp.com/xmlpad3.htm ) verwendest.

Zitat:

Zitat von nalii
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.

Dazu brauchst du Wissen über XPath:
http://www.w3schools.com/xpath/default.asp
http://www.linkwerk.com/pub/xmlidp/2000/kap-xpath.html
Mit XPath kannst du dir Daten aus der Tiefe der XML-Strukturen rausziehen, ohne die ganzen Knoten nach unten gehen zu müssen.

Zitat:

Zitat von nalii
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.

Verstehe nicht was du meinst.

nalii 16. Apr 2008 17:24

Re: mit Delphi ein Word XML Dokument verarbeiten
 
Zitat:

Zitat von shmia
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. http://www.wmhelp.com/xmlpad3.htm ) verwendest.

Die Zeilenumbrüche, usw. meine ich dabei gar nicht. Viel eher, dass Word meine Tagnamen verändert und aus <s:name> bspw. <ns1:name> macht. Aber wenn ich nicht allein bin, ist das schon mal etwas wert.

Zitat:

Zitat von shmia
Dazu brauchst du Wissen über XPath:
http://www.w3schools.com/xpath/default.asp
http://www.linkwerk.com/pub/xmlidp/2000/kap-xpath.html
Mit XPath kannst du dir Daten aus der Tiefe der XML-Strukturen rausziehen, ohne die ganzen Knoten nach unten gehen zu müssen.

Super, damit werde ich mich mal beschäftigen. Vielen Dank :)


Zitat:

Zitat von shmia
Verstehe nicht was du meinst.

Wenn du die XML Datei öffnest, müsstest du nach Name: Hans stehen haben. Wenn du den Namen löscht, erscheint der Platzhalter Name grau hinterlegt oder jedenfalls als Platzhalter gekennzeichnet. Ich suche eine Möglichkeit, diesen Platzhalter in Word umzubenennen in bspw. >> Vorname <<.

marabu 20. Apr 2008 12:36

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

nalii 20. Apr 2008 12:59

Re: mit Delphi ein Word XML Dokument verarbeiten
 
Zitat:

Zitat von marabu

Warum arbeitest du nicht einfach mit Feldern? Die sind in MSWord eigentlich genau für deine Zwecke vorgesehen.

Huhu, danke für die Antwort :)

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?

marabu 20. Apr 2008 13:31

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.

nalii 28. Apr 2008 13:34

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:
<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>
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?

Ich habe folgendes versucht:

Delphi-Quellcode:
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);
Aaaaaber da kommt nichts... mit // müsste ich eigentlich das ganze Dokument nach dem Element durchsuchen. Trotzdem wird nichts gefunden.

Sascha L 10. Mai 2008 15:52

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:

http://www.zvon.org/xxl/XPathTutoria.../example1.html

Beispiel Nr. 6 entspricht dann ungefähr dem, was du brauchst.

nalii 10. Mai 2008 16:04

Re: mit Delphi ein Word XML Dokument verarbeiten
 
Zitat:

Zitat von Sascha L
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:

http://www.zvon.org/xxl/XPathTutoria.../example1.html

Beispiel Nr. 6 entspricht dann ungefähr dem, was du brauchst.

Nach meinem Verständnis ist XPath eine Art SQL für XML Dokumente und die Operatoren wie / * usw. meine SELECT bzw. WHERE-Teile des Statements. Und diesen Tag ContactName will ich ja durchaus auch selektieren, weil nur er mich zu meiner Information bringt.

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 :)

Sascha L 10. Mai 2008 16:14

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:
//w:customXml[@w:element='ContactName']/w:tc/w:r/w:t
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.

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 02:54 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