AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi mit Delphi ein Word XML Dokument verarbeiten
Thema durchsuchen
Ansicht
Themen-Optionen

mit Delphi ein Word XML Dokument verarbeiten

Ein Thema von nalii · begonnen am 16. Apr 2008 · letzter Beitrag vom 10. Mai 2008
Antwort Antwort
nalii

Registriert seit: 2. Dez 2005
16 Beiträge
 
#1

mit Delphi ein Word XML Dokument verarbeiten

  Alt 16. Apr 2008, 16:32
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 = 'Berufthen 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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: mit Delphi ein Word XML Dokument verarbeiten

  Alt 16. Apr 2008, 17:14
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 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 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.
Andreas
  Mit Zitat antworten Zitat
nalii

Registriert seit: 2. Dez 2005
16 Beiträge
 
#3

Re: mit Delphi ein Word XML Dokument verarbeiten

  Alt 16. Apr 2008, 17:24
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 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 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 <<.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: mit Delphi ein Word XML Dokument verarbeiten

  Alt 20. Apr 2008, 12:36
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
  Mit Zitat antworten Zitat
nalii

Registriert seit: 2. Dez 2005
16 Beiträge
 
#5

Re: mit Delphi ein Word XML Dokument verarbeiten

  Alt 20. Apr 2008, 12:59
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?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: mit Delphi ein Word XML Dokument verarbeiten

  Alt 20. Apr 2008, 13:31
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.
  Mit Zitat antworten Zitat
nalii

Registriert seit: 2. Dez 2005
16 Beiträge
 
#7

Re: mit Delphi ein Word XML Dokument verarbeiten

  Alt 28. Apr 2008, 13:34
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.
  Mit Zitat antworten Zitat
Sascha L

Registriert seit: 4. Jun 2004
Ort: Hamm
390 Beiträge
 
Delphi 2006 Professional
 
#8

Re: mit Delphi ein Word XML Dokument verarbeiten

  Alt 10. Mai 2008, 15:52
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.
Sascha
  Mit Zitat antworten Zitat
nalii

Registriert seit: 2. Dez 2005
16 Beiträge
 
#9

Re: mit Delphi ein Word XML Dokument verarbeiten

  Alt 10. Mai 2008, 16:04
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
  Mit Zitat antworten Zitat
Sascha L

Registriert seit: 4. Jun 2004
Ort: Hamm
390 Beiträge
 
Delphi 2006 Professional
 
#10

Re: mit Delphi ein Word XML Dokument verarbeiten

  Alt 10. Mai 2008, 16:14
Lies dir bitte das Tutorial NOCHMAL gründlich von vorne bis hinten durch!

Du hast es nämlich immer noch nicht verstanden

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.
Sascha
  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 00:31 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