AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Visio-XML mit Mischung aus Textknoten und ChildNodes
Thema durchsuchen
Ansicht
Themen-Optionen

Visio-XML mit Mischung aus Textknoten und ChildNodes

Ein Thema von Hepdepaddel · begonnen am 11. Jan 2016 · letzter Beitrag vom 12. Jan 2016
Antwort Antwort
Benutzerbild von Hepdepaddel
Hepdepaddel

Registriert seit: 12. Dez 2005
Ort: Bremen
91 Beiträge
 
Delphi 2006 Enterprise
 
#1

Visio-XML mit Mischung aus Textknoten und ChildNodes

  Alt 11. Jan 2016, 16:57
Moin, zusammen,

aus einer Visio-Datei habe ich eine interessante XML-Konstruktion, die ich nicht ausgelesen bekomme. Generell geht es darum, den Titel eines Shapes aus einem Visio-XML zu lesen. Dieser Titel ist meist als Textknoten leiccht über Node.Text erhältlich, weil das in XML meist so aussieht:

Code:
 <Text>
   Gesuchter Text
 </Text>
Allerdings hat der Knoten namens Text mitunter weitere untergeordnete Knoten. Dann funktioniert der Zugriff auf Text nicht mehr, wie ja auch in der Delphi-Dokumentation beschrieben:

Code:
 <Text>
   <cp IX='0'/>
   <pp IX='0'/>
     Gesuchter Text
 </Text>
Mein Problem ist, dass ich keinen Weg sehe, "Gesuchter Text" in diesem Fall zu finden. XMLNode.Text scheidet aus, das liefert erwartungsgemäß eine Exception (kein Textknoten), Node.ChildNodes liefert nur die beiden Subnodes... der Text selbst scheint vollkommen unzugänglich zu sein, weil er weder Attribut Child ist - und auch kein Textknoten.

Mein aktueller Lösungsansatz ist, XMLNode.XML zu nutzen, das liefert alles inklusive den Text-Tags. Das parse ich dann notgedrungen "von Hand". Ist das wirklich der einzige Weg oder hat jemand eine bessere Idee?

Beste Grüße

Mark
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Visio-XML mit Mischung aus Textknoten und ChildNodes

  Alt 11. Jan 2016, 17:08
Gibt es kein Schema/DTD zum XML von Visio? Spontan hätte ich es wie folgt gemacht:

Delphi-Quellcode:
procedure justXmlThings();
const
   content: String =
      '<Text>' + sLineBreak +
      '   <cp IX=''0''/>' + sLineBreak +
      '   <pp IX=''0''/>' + sLineBreak +
      '   Gesuchter Text' + sLineBreak +
      '</Text>';
var
   xmlDoc:      IXMLDocument;
   xmlNode:   IXMLNode;
begin
   xmlDoc := LoadXMLData(content);
   xmlNode := xmlDoc.DocumentElement;

   if (xmlNode.ChildNodes.Count > 0) then
      ShowMessage(xmlNode.ChildNodes.Last.Text);
end;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Visio-XML mit Mischung aus Textknoten und ChildNodes

  Alt 11. Jan 2016, 17:20
Wenn es wirklich der letzte Eintrag ist. Kann es vorkommen, dass der Eintrag zwischen Unterknoten steht?
Markus Kinzler
  Mit Zitat antworten Zitat
Scurra

Registriert seit: 19. Jan 2015
81 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Visio-XML mit Mischung aus Textknoten und ChildNodes

  Alt 12. Jan 2016, 10:48
Bei mir ist xmlNode.ChildNodes.Count = 3. Bei mir funktioniert es so:
Delphi-Quellcode:
var
  xmlDoc: IXMLDocument;
  xmlNode: IXMLNode;
  idx: integer;
begin
  xmlDoc := newXMLDocument;
  xmlDoc.LoadFromFile(ExtractFilePath('C:\Test.xml');
  xmlNode := xmlDoc.DocumentElement.ChildNodes.Get(0);

  for idx := 0 to xmlNode.ChildNodes.Count -1 do
  begin
    if xmlNode.ChildNodes.Get(idx).NodeType = ntText then
      ShowMessage(xmlNode.ChildNodes.Get(idx).Text);
  end;
end;
Evtl. muss man noch Trim(...) verwenden o. ä.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Visio-XML mit Mischung aus Textknoten und ChildNodes

  Alt 12. Jan 2016, 14:13
del
$2B or not $2B

Geändert von himitsu (12. Jan 2016 um 14:27 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.737 Beiträge
 
Delphi 6 Enterprise
 
#6

AW: Visio-XML mit Mischung aus Textknoten und ChildNodes

  Alt 12. Jan 2016, 14:34
Auf jeden Fall scheint mir das kein Fehler von Visio, sondern "as designed" zu sein:

Zitat:
Im vorherigen Codebeispiel hatten der vorhandene Shapetext und die Zeichenfolge, mit der dieser ersetzt werden sollte, die gleiche Zeichenanzahl. Beachten Sie auch, dass die LINQ-Abfrage den Wert des letzten untergeordneten Knotens des zurückgegebenen Elements ändert (in diesem Fall des Textknotens). Auf diese Weise wird eine Änderung der Einstellung des cp-Elements vermieden, das ein untergeordnetes Element des Text-Elements ist.

Es kann zu Dateiinstabilität kommen, wenn Se den Shapetext programmgesteuert durch Überschreiben aller untergeordneten Elemente des Text-Elements ändern. Die Textformatierung wird wie im oberen Beispiel durch cp-Elemente unter dem Text-Element in der Datei dargestellt. Die Definition der Formatierung ist im übergeordneten Section-Element gespeichert. Wenn diese zwei Informationen nicht übereinstimmen, kann die Datei ein unerwartetes Verhalten aufweisen. Visio behebt zwar einige Inkonsistenzen, Sie sollten jedoch selbst sicherstellen, dass alle programmgesteuerten Änderungen konsistent sind, damit die Datei das erwartete Verhalten aufweist.
von hier
Ralph
  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 21:50 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