AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi XML-Referenz nach selectnodes
Thema durchsuchen
Ansicht
Themen-Optionen

XML-Referenz nach selectnodes

Ein Thema von StTüff · begonnen am 19. Jan 2007 · letzter Beitrag vom 25. Jan 2007
Antwort Antwort
Seite 1 von 2  1 2      
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#1

XML-Referenz nach selectnodes

  Alt 19. Jan 2007, 09:48
Hallo!

Ich habe ein Programm geschrieben, in dem der Inhalt einer XML-Datei in einer Baumstruktur (TreeView) dargestellt wird. Zu jedem Knoten im TreeView gibt es eine Referenz auf den zugehörigen XML-Knoten. Somit kann ich eine Wertänderung im TreeView direkt im XML-Knoten speichern.

Soweit so gut. Ich habe aber nun eine Funktion, die per xpath bestimmte Knoten im XML auswählt und automatisch Werte verändert. Diese Änderung möchte ich nun auch direkt auf die TreeView-Anzeige übertragen, ohne den ganzen Baum neu Aufzubauen.
Ich habe also folgendes versucht:

Edit: Fehler korrigiert...
Delphi-Quellcode:
X_Path := '...... ';
XML_CheckNodeList:=XMLDataModule.XMLDoc.selectNodes(X_Path);
XML_CheckNodeList.reset();
XML_CheckNode:= XML_CheckNodeList.nextNode();
while XML_CheckNode <> nil do
begin
  //Was verändern
  .....
  
  //Nach dem passenden Knoten im TreeView suchen
  TreeNode:=FindTypNode(XML_CheckNode );
  
  //TreeNode verändern
  .....
  XML_CheckNode:= XML_CheckNodeList.nextNode();
end;

function FindTypNode(LinkedXMLNode:IXMLDOMNode):TTreeNode;
var
  cnt:integer;
begin
    //Durch alle Knoten laufen
    for cnt:= 0 to form1.TrView_Struktur.Items.Count-1 do
    begin
      if PNodeState(form1.TrView_Struktur.Items[cnt].Data).XMLNode
          = LinkedXMLNode
      then
      begin
        result:=form1.TrView_Struktur.Items[cnt];
        exit;
     end;
    end;
  result:=nil;
end;
Leider ist es aber so, dass die Refernezen (auf die XML-Knoten), die ich aus der NodeList erhalte nicht mit denen übereinstimmen, die im TreeView hinterlegt sind.

Wird bei "selectnodes" eine Kopie erzeugt?
Ich habe hier ein kleines Verständnisproblem. Deshalb möchte ich gerne:
1. wissen was da passiert
2. eine Lösung für das Problem finden.

Vielen Dank für Eure Unterstützung,

StTüff
  Mit Zitat antworten Zitat
marabu

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

Re: XML-Referenz nach selectnodes

  Alt 19. Jan 2007, 10:29
Hallo,

deine Funktion FindTypNode() sieht nicht sehr gesund aus. Der Rückgabewert kann undefiniert sein und ist er es nicht, dann habe ich den Eindruck als hätte er immer den falschen Typ PNodeState anstelle von TTreeNode.

Grüße vom marabu
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: XML-Referenz nach selectnodes

  Alt 19. Jan 2007, 10:38
Ja, das ist natürlich richtig. Da ich das direkt eingetippt habe, ist mir hier der Fehler unterlaufen, was aber auch egal ist, weil ich gar nie einen gleichen Knoten finde.

Mein Problem ist, dass die Pointer auf die XML-Knoten aus der NodeList (=> Ergebnis aus selectnodes) nicht mit denen übereinstimmen, die ich zuvor im TreeView abgespeichert habe.

Ich habe mir mal die ganzen Pointer ausgeben lassen und es ist keine Übereinstimmung feststellbar.
Ich verstehe hier leider den Hintergrund nicht.

Gruß,

StTüff

PS: Ich kann übrigens in beiden Fällen auf den XML-Knoten zugreifen und komme auch "bei den richtigen Knoten an" (allerdings wohl über unterschiedliche Wege??).
  Mit Zitat antworten Zitat
marabu

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

Re: XML-Referenz nach selectnodes

  Alt 19. Jan 2007, 11:21
Wenn du gleiche Interfaces miteinander vergleichst und zwischendurch die Zeiger nicht freigibst, was über das reference counting je nach deiner Vorgehensweise auch automatisch geschehen kann, dann solltest du deine Zeiger wiederfinden. Hast du mal versucht das Problem zu isolieren? Wenn du Test-Code einstellst, dann würde ich mir das ansehen.

Freundliche Grüße
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#5

Re: XML-Referenz nach selectnodes

  Alt 19. Jan 2007, 12:33
Ja, ich habe ein kleines Testprojekt geschrieben, weil ich dachte, so den Hintergrund verstehen zu können. Leider war das aber nicht der Fall

Ich habe es mal angehängt.

Zur Erklärung des Programms:
Ich durchlaufe zunächst die ganze Struktur und gebe die Daten in das erste Memofeld aus. Danach lasse ich nach Knoten suchen und trage die Daten zu den gefundenen Knoten in ein zweites Memofeld ein.

Wenn man nun die NodeNames vergleicht, dann merkt man schnell, dass es im ersten Memofeld keinen Knoten gibt, der bei gleichem NodeName auch die gleiche Adresse führt. Was aber auch zu sehen ist, ist dass die Adressen sehr wohl vorkommen können (dann wohl bei Childs des gesuchten Knoten??).

Eigentlich kann das doch nicht so schwer sein, oder?

Na ja, es ist wohl wie immer: Meist hängt es an kleinen Dingen.

Gruß und vielen Dank für Deine Hilfe!

StTüff
Angehängte Dateien
Dateityp: zip xmltest_115.zip (164,8 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#6

Re: XML-Referenz nach selectnodes

  Alt 19. Jan 2007, 12:54
... ich bin jetzt noch einen Schritt weitergegangen und lasse mir jetzt auch die Childs zu den gesuchten Knoten ausgeben.

Interessant ist dabei, dass die Adressen der Childs (EDIT manchmal mit der Ausgabe im ersten Memofeld übereinstimmt. Betroffen ist dann also nur der gesuchte Knoten selbst ....



Gruß,

StTüff
  Mit Zitat antworten Zitat
marabu

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

Re: XML-Referenz nach selectnodes

  Alt 19. Jan 2007, 18:13
Hallo,

ich habe mir deinen Code angesehen und an einer Stelle die notwendige Korrektur gemacht, die andere Stelle änderst dann du:

Delphi-Quellcode:
// ...
  procedure insert(const XMLNode: IXMLDOMNode);
  var
    u: IUnknown;
  begin
    u := XMLNode as IUnknown;
    mem_1.lines.add(inttohex(integer(u),6) + ' : ' + XMLNode.nodename);
    if(XMLNode.childNodes.length > 0) then
      for i := 0 to XMLNode.childNodes.length - 1 do
        insert(XMLNode.childNodes[i]);
  end;
// ...
Zwei Interface-Pointer zeigen auf dasselbe Objekt, wenn ihre IUnknown-Pointer identisch sind.

Freundliche Grüße
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#8

Re: XML-Referenz nach selectnodes

  Alt 22. Jan 2007, 07:43
Hallo!

Erst mal: Entschuldigung, dass ich mich jetzt erst melde. Ich war über das Wochenende "offline".

Ich habe nun noch folgende Änderung vorgenommen:

Delphi-Quellcode:
.....
 X_Path := '//PROGRAMM[@PROGNUM=1]/LEVEL_A/LEVEL_B';
  XML_CheckNodeList:=XMLDoc.selectNodes(X_Path);
  XML_CheckNodeList.reset();
  XML_CheckNode:= XML_CheckNodeList.nextNode();
  while XML_CheckNode <> nil do
  begin
    u := XML_CheckNode as IUnknown;
    //Knoteninfo in mem_2 ausgeben:
    mem_2.lines.add(
      inttohex(integer(u),6)+ ' : '+
      XML_CheckNode.nodename
      + ': '+ XML_CheckNode.attributes.getNamedItem('TYPID').nodeValue
      );
  end;
end;
....
...und siehe da es geht....

Nun funktioniert es zwar, ich verstehe aber immer noch nicht so genau warum.
Ich habe versucht in der Hilfe einige Infos zu finden. Ganz klar ist es mir aber immer noch nicht.
Es muss wohl etwas mit der Art des Interfaces zu tun haben. Da ich aber in beiden Fällen (also mit und ohne IUnknown) "beim richtigen Knoten ankomme", scheint es mir, als sei da noch etwas temporär zwischengeschaltet, das quasi vermittelt???
Wie Du siehst stochere ich ziemlich im Nebel. Kannst Du mir vielleicht ein paar erklärende Worte spenden?


Gruß und vielen Dank,

StTüff
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#9

Re: XML-Referenz nach selectnodes

  Alt 25. Jan 2007, 07:52
Hallo!

Kann mir noch jemand den Grund erklären, oder sagen, bei welchem Thema (Interface; COM...) ich weitere Infos dazu finden kann. Eventuell wären auch einig Links hilfreich.
Damit wäre dann mein Frage endgültig beantwortet.

Vielen Dank!

StTüff
  Mit Zitat antworten Zitat
marabu

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

Re: XML-Referenz nach selectnodes

  Alt 25. Jan 2007, 08:32
Guten Morgen,

dass du mit einem beliebigen Interface Pointer zu deinem Knoten gelangst, liegt an den internen Indirektionsmechanismen - da zeigen Zeiger auf Zeiger und Zeigertabellen, dass es nur so eine Pracht ist. Deshalb kann alleine das Elementar-Interface IUnknown für Addressvergleiche herhalten.

Um mit COM (Common Object Model) arbeiten zu können genügt meiner Meinung nach bereits die Delphi Hilfe. Web-Links habe ich keine parat und meine Literatur zum Thema COM ist schon alt. Allzu tief würde ich da heute nicht mehr einsteigen, denn Microsoft betrachtet COM als legacy und legt den Entwicklern heute .NET ans Herz. Die Unterstützung von COM in Windows Vista ist "lediglich" als Investitionsschutzmaßnahme zu verstehen, wenn ich die Hinweise richtig deute.

Freundliche Grüße
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:23 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