Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XML: Namespace - Zuweisung funktioniert nicht (https://www.delphipraxis.net/69882-xml-namespace-zuweisung-funktioniert-nicht.html)

s14 22. Mai 2006 13:30

Re: XML: Namespace - Zuweisung funktioniert nicht
 
s-off,
ich habe mal die Knoten einer XML-Datei so ausgewertet:

Delphi-Quellcode:
function XMLGetSoftwareItems: TSoftwareItems;
// Gibt eine Liste der zu installierenden Software und deren Status
// für die grafische Aufbereitung zurück.
var
  XMLColl : IXMLDOMDocument2;
  XMLNodes : IXMLDOMNodeList;
  XMLNode : IXMLDOMNode;
  i, err  : Integer;
  s       : String;
begin


  XMLColl := CoDOMDocument30.Create;
  XMLColl.load( XMLFilename );

  err := XMLColl.parseError.errorCode;
  if err = 0 then
  begin
    XMLNodes := XMLColl.documentElement.selectNodes('setup');
    for i := 0 to XMLNodes.length -1 do
    begin
      XMLNode := XMLNodes.item[i];

      SetLength(Result, XMLNodes.length);

      Result[i].Status := StrToInstStatus(XMLNode.selectSingleNode('InstStatus').text);

      Result[i].Text := XMLNode.selectSingleNode('name').text;

      Result[i].ID := StrToIntDef(XMLNode.selectSingleNode('id').text, 0);

    end;
  end else
  begin
    Log(Format('In "XMLGetSoftwareItems" ist die Analyse der XML-Datei "%s" ist fehlgeschlagen:', [XMLFilename]), etError);
    Log(Format(' %s', [XMLColl.parseError.reason]));
  end;
end;
Das muss natürlich von Dir angepasst werden. Ich wollte nur die Funktionsweise aufzeigen. :-)

Gruß

marabu 22. Mai 2006 13:37

Re: XML: Namespace - Zuweisung funktioniert nicht
 
Sascha, probiere es mal so:

Delphi-Quellcode:
... xmlDoc.selectSingleNode('/kml/Document/Folder') ...
marabu

s-off 22. Mai 2006 13:49

Re: XML: Namespace - Zuweisung funktioniert nicht
 
Funktioniert leider auch nicht:

Delphi-Quellcode:
procedure TfrmMain.toolbarButtons_btnOpenFileClick(Sender: TObject);
var
   Node: IXMLDOMNode;
begin
   if OpenDialog1.Execute then
   begin
      xmlDoc := CoDomDocument40.Create;
      xmlDoc.async := False;

      sXMLFileName := OpenDialog1.FileName;

      xmlDoc.Load(sXMLFileName);

      Node := xmlDoc.selectSingleNode('/kml/Document/Folder'); //<-- Node bleibt NIL

      showmessage(node.text);
   end;
end;

s14 22. Mai 2006 13:58

Re: XML: Namespace - Zuweisung funktioniert nicht
 
Also, wenn ich das richtig sehe sind in der Datei mehrere Knoten mit dem Namen "Folder" in der selben Ebene.
Du musst zuerst eine NodeList auf '/kml/Document/Folder' setzen und dann mit
einer SingleNode "NodeList[i]" darauf zugreifen um alle "Folder" zu durchlaufen.

Warum hast Du bei meinem Beispiel die NodeList ignoriert? ;-)

s-off 22. Mai 2006 14:05

Re: XML: Namespace - Zuweisung funktioniert nicht
 
Hallo s14, ich habe eine NodeList, die ich Element für Element durchgehe ->

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;
Ausgangspunkt ist hier Node, welche aus 'toolbarButtons_btnOpenFileClick' (siehe Vorbeitrag) kommt.
Wenn Du Dir meine vorherigen Beiträge anschaust, wirst Du sehen, dass ich diesbezüglich schon viel herumexperimentiert habe :wink:

marabu 22. Mai 2006 15:21

Re: XML: Namespace - Zuweisung funktioniert nicht
 
Hallo Sascha,

der angegebene XPath ist jetzt korrekt für den aktuellen Kontext. Wenn trotzdem das Ergebnis nil ist, dann ist der Knoten "Folder" nicht der einzige Knoten mit diesem Namen. Du musst dann noch ein identifizierendes Merkmal mit aufnehmen, damit der Zugriff eindeutig wird.

marabu

Neuromancer 22. Mai 2006 15:58

Re: XML: Namespace - Zuweisung funktioniert nicht
 
Zitat:

Zitat von s-off
XML-Code:
<kml xmlns="http://earth.google.com/kml/2.0">

Vorsicht, ich glaube, hier liegt der casus cnactus...

Du deklarierst hier einen sogenannten "Empty Namespace", und das mag der M$-XML-Parser überhaupt nicht. (Irgendwo im msdn steht das auch, dass er das nicht mag...)

Aber ein wenig Workaround schafft Abhilfe:

Delphi-Quellcode:
aXMLDOMDoc.setProperty('NewParser', true);
aXMLDOMDoc.setProperty('SelectionLanguage', 'XPath');
aXMLDOMDoc.setProperty('SelectionNamespaces', 'xmlns:ENS="http://earth.google.com/kml/2.0"'); // Den empty ns (=ENS) dem Parser mitteilen.
der entsprechende XPath-Befehl sieht dann so aus:
Delphi-Quellcode:
    aXMLDOMDoc.selectSingleNode('/ENS:Knoten1/ENS:Knoten2/ENS:Knoten3...usw.');
Gruß

marabu 22. Mai 2006 16:09

Re: XML: Namespace - Zuweisung funktioniert nicht
 
Hallo Armin,

hier liegt ein default namespace vor - kein empty namespace.

Grüße vom marabu

Neuromancer 22. Mai 2006 16:16

Re: XML: Namespace - Zuweisung funktioniert nicht
 
Zitat:

Zitat von marabu
Hallo Armin,

hier liegt ein default namespace vor - kein empty namespace.

Grüße vom marabu

Ähm, entschuldige, ich meinte natürlich einen default namespace... :oops:

Ändert aber nichts an der Tatsache, dass der M$-XML-Parser damit nicht umgehen kann.

Ich habe jetzt nicht genau die Stelle im msdn gefunden, in der es geschrieben steht, aber dafür folgendes:

Zitat:

Zitat von msdn
However, using default namespaces instead of utilizing explicitly mapped prefixes for element names can be confusing because it is not obvious that the elements in the document are namespace scoped.

Gruß

marabu 22. Mai 2006 16:29

Re: XML: Namespace - Zuweisung funktioniert nicht
 
Was wäre wenn du dich irren würdest? Nicht auszudenken - die Verwirrung bei den Lesern, welche weniger davon verstehen als ich und du. Kannst du es nicht einfach schnell mal ausprobieren? Die nötigen Testdaten stehen im PSDK oder auch der MSDN Online Library. Du musst auch kein Programm zum Testen schreiben. Nimm einfach MSXSL.EXE dazu.

Freundliche Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 Uhr.
Seite 3 von 5     123 45      

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