Thema: Delphi RDF auslesen

Einzelnen Beitrag anzeigen

MathiasSimmack
(Gast)

n/a Beiträge
 
#3

Re: RDF auslesen

  Alt 14. Feb 2004, 09:00
Dass "selectNodes" und "selectSingleNode" nicht richtig funktionieren, liegt am verwendeten Namespace
Code:
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns="http://my.netscape.com/rdf/simple/0.9/">
Das zweite Attribut wird u.a. für die "item"-Knoten verwendet. Das siehst du auch, wenn du deinen Code zum Einlesen mal modifizierst:
Delphi-Quellcode:
for i := 2 to xmlTopics.length-1 do
  ShowMessage(xmlTopics.item[i].xml);
Hier werden die "item"-Knoten nämlich so angezeigt:
Code:
<item xmlns="http://my.netscape.com/rdf/simple/0.9/">
Da das aber kein Attribut im Sinne des Wortes ist (du kannst also nicht über "getAttribute" und Co. darauf zugreifen), deklarierst du nach dem Laden des XML-Codes einfach folgendes:
Delphi-Quellcode:
xmldoc.setProperty('SelectionNamespaces',
  'xmlns:na="http://my.netscape.com/rdf/simple/0.9/"');
Wenn du mal schaust: Das unterscheidet sich nur durch das :na von der Angabe in der XML-Datei. Und genau dieses na (steht bei mir für name attribute) dient als Alias. (Du kannst stattdessen auch den Namen deiner Freundin oder was weiß ich angeben.) Zugegriffen wird dann wieder wie gehabt, wobei du den/das (?) Alias vor den gesuchten Knotennamen stellst:
Delphi-Quellcode:
xmlTopics := xmldoc.selectNodes('//na:item/na:title');
if(xmlTopics.length > 0) then
  for i := 0 to xmlTopics.length - 1 do
    lbTopics.Items.Add(xmlTopics.item[i].text);
Die Angabe des Alias ist, wie gesagt!, erforderlich, weil die Knoten sonst nicht gefunden werden.

Dein Problem mit der Zugriffsverletzung bei der URL lässt sich auf ähnliche Art lösen, wobei ich aber vorschlagen möchte, dass du in jedem Fall den Umweg über einen Knoten (IXMLDOMNode) nimmst. Momentan entsteht die Zugriffsverletzung nämlich, weil "selectSingleNode" (auf Grund des Namespace) nichts findet, und du versuchst nun den Text eines nicht gefundenen Knotens an eine Variable zu übergeben.
Das kann aber auch passieren, wenn du im Editor bspw. einen Knoten aus der XML-Datei entfernst und vergessen hast, dass das Programm noch eine zuvor geladene, vollständige Version des Dokumentes benutzt.

Daher würde ich das also so machen:
Delphi-Quellcode:
node := xmldoc.selectSingleNode('//na:item[na:title="' +
  lbTopics.Items[lbTopics.ItemIndex] + '"]/na:link');

if(node <> nil) then
begin
  sUrl := node.text;
  ShellExecute(self.Handle,'open',pchar(sUrl),nil,nil,SW_SHOWNORMAL);
end;
(falls erforderlich musst du vorher wieder die Namespace-Eigenschaft setzen!)
  Mit Zitat antworten Zitat