![]() |
XML: Namespace - Zuweisung funktioniert nicht
Hallo zusammen,
folgendes: ich habe eine XML-Datei nach folgendem Schema:
XML-Code:
Ich möchte nun die einzelnen Ordner in eine TreeView-Komponente einlesen.
<?xml version="1.0" encoding="UTF-8"?>
<inputx xmlns="http://einszweidrei.de"> <document> <ordner> <name>Ordner1</name> <datei> <name>Datei1</name> <groesse>Groesse1</groesse> <attribut>Attribut1</attribut> </datei> <ordner> <name>Ordner2</name> <datei> <name>Datei2</name> <groesse>Groesse2</groesse> <attribut>Attribut2</attribut> </datei> <datei> <name>Datei3</name> <groesse>Groesse3</groesse> <attribut>Attribut3</attribut> </datei> <datei> <name>Datei4</name> <groesse>Groesse4</groesse> <attribut>Attribut4</attribut> </datei> <ordner> <name>Ordner3</name> <datei> <name>Datei2</name> <groesse>Groesse2</groesse> <attribut>Attribut2</attribut> </datei> <datei> <name>Datei3</name> <groesse>Groesse3</groesse> <attribut>Attribut3</attribut> </datei> <datei> <name>Datei4</name> <groesse>Groesse4</groesse> <attribut>Attribut4</attribut> </datei> </ordner> </ordner> </ordner> </document> </inputx> Das funktioniert auch super, wenn ich den Namespace vorher aus der Datei entferne. Lasse ich den Namespace in der Datei, und weise ihn folgendermaßen zu, funktioniert das auslesen nicht mehr:
Delphi-Quellcode:
Die Ordner versuche ich nun, so einzulesen und in den TreeView zu schreiben, da ich das mit dem voranstellen von 'na:' hier im Forum gefunden habe:
xmlDoc.Load(sXMLFileName);
xmlDoc.SetProperty('SelectionNamespaces','xmlns:na="http://einszweidrei.de"');
Delphi-Quellcode:
Tja, nur leider funktioniert das so nicht - nl.Folders.length bleibt 0 und der TreeView leer :o(
procedure TfrmMain.ShowFolders(Node: IXMLDOMElement; nParent: PVirtualNode);
var i: Integer; nlFolders: IXMLDOMNodeList; nName, nChild: IXMLDOMElement; TreeData: TTreeData; begin ChangeCursor; tvTree.BeginUpdate; try tvTree.NodeDataSize := SizeOf(TTreeData); nlFolders := Node.selectNodes('na:Folder'); for i := 0 to Pred(nlFolders.length) do begin nChild := nlFolders.item[i] as IXMLDomElement; nName := nChild.selectSingleNode('na:name') as IXMLDOMElement; TreeData.Caption := nName.text; TreeData.Node := nChild; ShowFolders(nChild, AddVSTStructure(nParent, TreeData, nChild)); end; finally tvTree.EndUpdate; ChangeCursor; end; end; |
Re: XML: Namespace - Zuweisung funktioniert nicht
Klar, weil die Unterknoten keinen eigenen Namespace besitzen.
|
Re: XML: Namespace - Zuweisung funktioniert nicht
Hallo,
und was bedeutet das? Ich kann die Datei auch nicht einlesen, wenn ich das 'na:' vor den zu suchenden Nodes weglasse. Lösche ich aber den Namespace aus der XML-Datei, so funktioniert das Einlesen problemlos. Ich habe das hier in mehreren Beiträgen gelesen, wo die gleiche Ausgangssituation bestand, beispielsweise hier: ![]() oder hier: ![]() |
Re: XML: Namespace - Zuweisung funktioniert nicht
Eins vorweg: Mein Fehler, :oops:, du kannst dir die ganze Arbeit sparen. Zweitens: die Situation ist nicht identisch, weil die gezeigten Beispiele davon ausgingen, dass einzelne Knoten einer XML-Datei unterschiedliche Namespaces haben. In deinem Fall gibt es nur einen, der im Root-Knoten deklariert wird. Daher kannst du auf den ganzen "SelectionNamespaces"-Quatsch verzichten und gleich per XPath die gewünschten Knoten abgreifen. Der Beweis:
Delphi-Quellcode:
zeigt den XML-Knoten des Ordners "Ordner2". :stupid:
var
xmldoc : DomDocument; node : IXMLDOMNode; begin xmldoc := CoDomDocument.Create; if xmldoc <> nil then try xmldoc.load('bla.xml'); node := xmldoc.selectSingleNode('/inputx/document/ordner/ordner'); ShowMessage (node.xml); finally xmldoc := nil; end; end; |
Re: XML: Namespace - Zuweisung funktioniert nicht
Hallo,
das funktioniert leider auch nicht *verzweifel* Also, ich lese die Datei folgendermaßen ein:
Delphi-Quellcode:
Dann rufe ich die Prozedur ShowFolders auf und übergebe die Node:
procedure TfrmMain.toolbarButtons_btnOpenFileClick(Sender: TObject);
var Node: IXMLDOMElement; begin if OpenDialog1.Execute then begin xmlDoc := CoDomDocument40.Create; xmlDoc.async := False; sXMLFileName := OpenDialog1.FileName; xmlDoc.Load(sXMLFileName); ClearTreeView(tvTree); Node := xmlDoc.selectSingleNode('/inputx/document') as IXMLDOMElement; <- hier habe ich schon zig Varianten getestet ShowFolders(Node, nil); <- hier übergebe ich Node an ShowFolders oStatusBar1.Panels[0].Caption := sXMLFileName; end; end;
Delphi-Quellcode:
Das Problem ist aber, dass in der ersten Prozedur die Variable Node schon Nil bleibt.
procedure TfrmMain.ShowFolders(Node: IXMLDOMElement; nParent: PVirtualNode);
var i: Integer; nlFolders: IXMLDOMNodeList; nName, nChild: IXMLDOMElement; TreeData: TTreeData; begin ChangeCursor; tvTree.BeginUpdate; try tvTree.NodeDataSize := SizeOf(TTreeData); nlFolders := Node.selectNodes('Folder'); for i := 0 to Pred(nlFolders.length) do begin nChild := nlFolders.item[i] as IXMLDomElement; nName := nChild.selectSingleNode('name') as IXMLDOMElement; TreeData.Caption := nName.text; TreeData.Node := nChild; ShowFolders(nChild, AddVSTStructure(nParent, TreeData, nChild)); end; finally tvTree.EndUpdate; ChangeCursor; end; end; Node := xmlDoc.selectSingleNode('/inputx/document') as IXMLDOMElement; findet also nichts :( Hier noch die Funktion, mit der ich dann den TreeView fülle:
Delphi-Quellcode:
Ich öle schon den ganzen Tag daran herum, aber es will und will nicht funktionieren :(
function TfrmMain.AddVSTStructure(ANode: PVirtualNode; ARecord: TTreeData; nNode: IXMLDOMElement): PVirtualNode;
var Data: PTreeData; begin Result := tvTree.AddChild(ANode); Data := tvTree.GetNodeData(Result); tvTree.ValidateNode(Result, False); Data^.Caption := ARecord.Caption; Data^.Node := nNode; Data^.ImageIndex := 1; end; Wäre lieb, wenn sich nochmal jemand erbarmen würde :? |
Re: XML: Namespace - Zuweisung funktioniert nicht
Guten Morgen Sascha.
Wenn ich mir die Testdaten im Beitrag #1 anschaue, dann frage ich mich, warum ein perfektes root element (document) nochmal in ein Element verpackt wird, nur um einen default namespace zu vergeben. Da du im Verlauf des threads noch mit dem Alias na experimentierst, scheint der namespace keine Vorgabe zu sein - oder? Am Beispiel deiner Testdaten dokumentiert der default namespace eigentlich nur, zu welcher tag library dein markup gehört. Das erlaubt eine Validierung sogar bei gleichzeitig vorhandener Namensüberdeckung, die du aber nicht hast, da nur eine tag library verwendet wird. Für deinen Code ändert sich da gar nichts. Der Zugriff über XPath bleibt derselbe, bis auf das versenkte root element "document". An deinem Programmcode sieht man, dass du mit anderem markup als dem gezeigten testest. Mag sein, dass in deinem Code die Selektion des Startelements für ShowFolder fehlschlägt. In meinem Code mit deinem markup aus Beitrag #1 gibt es keine Probleme. Grüße vom marabu |
Re: XML: Namespace - Zuweisung funktioniert nicht
Hallo marabu,
der Namespace steht genau so (nur mit anderer URL) in meiner XML-Datei. Korrekt, der Inhalt der XML-Datei ist nicht exakt der, den ich in Beitrag #1 gepostet habe - aber die gleiche Struktur. Ich werde das gleich noch einmal ausprobieren - ohne document. Danke. |
Re: XML: Namespace - Zuweisung funktioniert nicht
Zitat:
Delphi-Quellcode:
Voilà, die Dialogbox zeigt mir den XML-Code ab <document> an. Das bedeutet also, "Node" ist nicht nil, und der Code macht exakt das, was man von ihm erwartet. Dass ich den Dateinamen fest angegeben habe, und dass ich auch "ClearTreeView" nicht verwendet habe, dürfte hier zu vernachlässigen sein.
xmlDoc.Load('bla.xml');
Node := xmlDoc.selectSingleNode('/inputx/document') as IXMLDOMElement; ShowMessage(Node.xml); Guck mal in deine "ShowFolders"-Prozedur Zitat:
Warnung: Dieser Beitrag könnte verletzenden Sarkasmus enthalten. |
Re: XML: Namespace - Zuweisung funktioniert nicht
Hallo Mathias,
mit Deinem 'verletzenden' Sarkasmus kann ich gut umgehen :wink: Vielleicht erläutere ich mal ganz kurz die Situationh, in der ich mich augenblicklich befinde. Bis vor einer Woche habe ich mich weder mit dem Thema XML, noch mit dem Thema VirtualTreeView, noch mit dem Thema Pointern auseinandersetzen müssen. Jetzt muss es leider sein, und die XML-Datei, mit der ich zu tun habe, sowie der VirtualTreeView von Mike Lischke sind dabei Vorgabe. Wenn ich bei Google das Stichwort 'XML' oder 'XPath' eingebe, dann gibt es kaum noch Seiten, die nicht als 'bereits besucht' gekennzeichnet werden. Es ist also nicht so, dass ich mich auf meinen Hintern setze, und andere machen lasse. Es ist nur so, dass hier drei Themen auf mich stürzen, mit denen ich - ich möchte nicht sagen, dass ich überfordert bin - aber die mir schon einige Kopfschmerzen bereiten. Wenn Du das Thema auf Anhieb verstanden hast, als Du anfingst, Dich damit zu beschäftigen, dann finde ich das schön - geh aber bitte nicht davon aus, dass es jedem so leicht fällt, sich in neue Dinge innerhalb kürzester Zeit einzuarbeiten. So, nun zu Deiner Antwort: Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
So, ich probiere es nun nochmal mit den Anmerkungen von marabu - sprich ohne document - sollte das auch nicht funktionieren, dann bettel ich wieder um Hilfe :wink: |
Re: XML: Namespace - Zuweisung funktioniert nicht
Hallo Sascha,
nur damit du dich nicht verrennst: Zitat:
Noch ein Tip: es ist nicht gut, wenn du in einem Projekt gleich mehrere persönliche Forschungsgebiete angehst. Du kommst am schnellsten zum Ziel, wenn du zuerst ein Demo-Projekt zum Umgang mit allen Aspekten von Zeigern erstellst. Das Einarbeiten in VST und XML würde ich getrennt angehen. Erst wenn du dich im Umgang mit den einzelnen Techniken vertraut fühlst, solltest du deine eigentliche Anwendung ins Auge fassen. Freundliche Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz