Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Visio-XML mit Mischung aus Textknoten und ChildNodes (https://www.delphipraxis.net/187878-visio-xml-mit-mischung-aus-textknoten-und-childnodes.html)

Hepdepaddel 11. Jan 2016 15:57


Visio-XML mit Mischung aus Textknoten und ChildNodes
 
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

Der schöne Günther 11. Jan 2016 16:08

AW: Visio-XML mit Mischung aus Textknoten und ChildNodes
 
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;

mkinzler 11. Jan 2016 16:20

AW: Visio-XML mit Mischung aus Textknoten und ChildNodes
 
Wenn es wirklich der letzte Eintrag ist. Kann es vorkommen, dass der Eintrag zwischen Unterknoten steht?

Scurra 12. Jan 2016 09:48

AW: Visio-XML mit Mischung aus Textknoten und ChildNodes
 
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. ä.

himitsu 12. Jan 2016 13:13

AW: Visio-XML mit Mischung aus Textknoten und ChildNodes
 
del

Jumpy 12. Jan 2016 13:34

AW: Visio-XML mit Mischung aus Textknoten und ChildNodes
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:52 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