AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi XML: Namespace - Zuweisung funktioniert nicht
Thema durchsuchen
Ansicht
Themen-Optionen

XML: Namespace - Zuweisung funktioniert nicht

Ein Thema von s-off · begonnen am 21. Mai 2006 · letzter Beitrag vom 17. Mär 2009
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
s-off
(Gast)

n/a Beiträge
 
#1

XML: Namespace - Zuweisung funktioniert nicht

  Alt 21. Mai 2006, 19:57
Hallo zusammen,

folgendes:

ich habe eine XML-Datei nach folgendem Schema:

XML-Code:
<?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>
Ich möchte nun die einzelnen Ordner in eine TreeView-Komponente einlesen.
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:
      xmlDoc.Load(sXMLFileName);
      xmlDoc.SetProperty('SelectionNamespaces','xmlns:na="http://einszweidrei.de"');
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:

Delphi-Quellcode:
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;
Tja, nur leider funktioniert das so nicht - nl.Folders.length bleibt 0 und der TreeView leer (
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#2

Re: XML: Namespace - Zuweisung funktioniert nicht

  Alt 21. Mai 2006, 20:32
Klar, weil die Unterknoten keinen eigenen Namespace besitzen.
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#3

Re: XML: Namespace - Zuweisung funktioniert nicht

  Alt 21. Mai 2006, 21:05
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:

Delphipraxis

oder hier:

Delphipraxis
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#4

Re: XML: Namespace - Zuweisung funktioniert nicht

  Alt 21. Mai 2006, 21:19
Eins vorweg: Mein Fehler, , 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:
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;
zeigt den XML-Knoten des Ordners "Ordner2".
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#5

Re: XML: Namespace - Zuweisung funktioniert nicht

  Alt 21. Mai 2006, 22:01
Hallo,

das funktioniert leider auch nicht *verzweifel*

Also, ich lese die Datei folgendermaßen ein:

Delphi-Quellcode:
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;
Dann rufe ich die Prozedur ShowFolders auf und übergebe die Node:

Delphi-Quellcode:
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;
Das Problem ist aber, dass in der ersten Prozedur die Variable Node schon Nil bleibt.
Node := xmlDoc.selectSingleNode('/inputx/document') as IXMLDOMElement; findet also nichts

Hier noch die Funktion, mit der ich dann den TreeView fülle:

Delphi-Quellcode:
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;
Ich öle schon den ganzen Tag daran herum, aber es will und will nicht funktionieren
Wäre lieb, wenn sich nochmal jemand erbarmen würde
  Mit Zitat antworten Zitat
marabu

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

Re: XML: Namespace - Zuweisung funktioniert nicht

  Alt 22. Mai 2006, 05:40
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
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#7

Re: XML: Namespace - Zuweisung funktioniert nicht

  Alt 22. Mai 2006, 07:19
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.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#8

Re: XML: Namespace - Zuweisung funktioniert nicht

  Alt 22. Mai 2006, 07:47
Zitat von s-off:
das funktioniert leider auch nicht *verzweifel*
Es ist immer wieder lustig, solche Sachen lesen zu müssen, nachdem man getesteten Code postet. Nun ja, ich sage mal, du machst definitiv etwas falsch. Ich habe nur zwei Zeilen aus deinem Code genommen und die Anzeige des XML-Codes per "ShowMessage" ergänzt:
Delphi-Quellcode:
      xmlDoc.Load('bla.xml');
Node := xmlDoc.selectSingleNode('/inputx/document') as IXMLDOMElement;
ShowMessage(Node.xml);
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.

Guck mal in deine "ShowFolders"-Prozedur
Zitat:
nlFolders := Node.selectNodes('na:Folder');
Denk mal darüber nach. Oder falls das zu subtil war: Wo in deiner XML-Datei befindet sich denn ein Knoten mit dem Namen <Folder>? Ich bin der Meinung, es könnte damit zu tun haben, dass dein Baum leer bleibt.



Warnung: Dieser Beitrag könnte verletzenden Sarkasmus enthalten.
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#9

Re: XML: Namespace - Zuweisung funktioniert nicht

  Alt 22. Mai 2006, 08:35
Hallo Mathias,

mit Deinem 'verletzenden' Sarkasmus kann ich gut umgehen

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:
Es ist immer wieder lustig, solche Sachen lesen zu müssen, nachdem man getesteten Code postet.
Die von Dir geposteten Codezeilen werden sicherlich funktionieren - aber in meinen Funktionen / Prozeduren funktioniert es, wie ich oben versucht habe deutlich zu machen, nicht.

Zitat:
Nun ja, ich sage mal, du machst definitiv etwas falsch.
Ich gehe ganz stark davon aus, dass ich irgendeine grundlegende Sache noch nicht verstanden habe - ja.

Zitat:
Ich habe nur zwei Zeilen aus deinem Code genommen und die Anzeige des XML-Codes per "ShowMessage" ergänzt:
Delphi-Quellcode: markieren
xmlDoc.Load('bla.xml');
Node := xmlDoc.selectSingleNode('/inputx/document') as IXMLDOMElement;
ShowMessage(Node.xml);

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.
Wie bereits gesagt, sollte das so, wie es dort steht, funktionieren. Nagel mich jetzt bitte nicht darauf fest, dass ich sagte
Zitat:
s-off hat folgendes geschrieben:
das funktioniert leider auch nicht *verzweifel*
Das war schlicht und einfach auf meinen Code mit Deinem Vorgehen bezogen.

Zitat:
Denk mal darüber nach. Oder falls das zu subtil war: Wo in deiner XML-Datei befindet sich denn ein Knoten mit dem Namen <Folder>? Ich bin der Meinung, es könnte damit zu tun haben, dass dein Baum leer bleibt.
Wie in meinem letzten Beitrag bereits erwähnt, entspricht die gepostete XML-Datei inhaltlich nicht dem Original - strukturell dennoch schon.

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
  Mit Zitat antworten Zitat
marabu

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

Re: XML: Namespace - Zuweisung funktioniert nicht

  Alt 22. Mai 2006, 08:54
Hallo Sascha,


nur damit du dich nicht verrennst:

Zitat von marabu:
Der Zugriff über XPath bleibt derselbe, bis auf das versenkte root element "document"
Damit wollte ich nur ausdrücken, dass durch die Einführung des tags "inputx" das ursprüngliche root element "document" (um bei den tagnames aus deinem Beispiel zu bleiben) um eine Ebene weiter nach unten versetzt wurde und dadurch der XPath Ausdruck nicht "/document" sondern "/inputx/document" sein muss - wie du es ja selbst richtig erkannt hast. In meinem Beispiel-Code (Demo mit ShowFolder) mache ich glaube ich gar keine Query, weil das root element über die Methode documentElement() verfügbar ist.

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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


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 07:48 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