![]() |
Re: XML: Namespace - Zuweisung funktioniert nicht
s-off,
ich habe mal die Knoten einer XML-Datei so ausgewertet:
Delphi-Quellcode:
Das muss natürlich von Dir angepasst werden. Ich wollte nur die Funktionsweise aufzeigen. :-)
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; Gruß |
Re: XML: Namespace - Zuweisung funktioniert nicht
Sascha, probiere es mal so:
Delphi-Quellcode:
marabu
... xmlDoc.selectSingleNode('/kml/Document/Folder') ...
|
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; |
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? ;-) |
Re: XML: Namespace - Zuweisung funktioniert nicht
Hallo s14, ich habe eine NodeList, die ich Element für Element durchgehe ->
Delphi-Quellcode:
Ausgangspunkt ist hier Node, welche aus 'toolbarButtons_btnOpenFileClick' (siehe Vorbeitrag) kommt.
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; Wenn Du Dir meine vorherigen Beiträge anschaust, wirst Du sehen, dass ich diesbezüglich schon viel herumexperimentiert habe :wink: |
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 |
Re: XML: Namespace - Zuweisung funktioniert nicht
Zitat:
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:
der entsprechende XPath-Befehl sieht dann so aus:
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.
Delphi-Quellcode:
Gruß
aXMLDOMDoc.selectSingleNode('/ENS:Knoten1/ENS:Knoten2/ENS:Knoten3...usw.');
|
Re: XML: Namespace - Zuweisung funktioniert nicht
Hallo Armin,
hier liegt ein default namespace vor - kein empty namespace. Grüße vom marabu |
Re: XML: Namespace - Zuweisung funktioniert nicht
Zitat:
Ä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:
|
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 02:13 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-2025 by Thomas Breitkreuz