Entwickler-Ecke

Dateizugriff - XML Dateizugriff


Flamefire - Do 18.11.10 23:11
Titel: XML Dateizugriff
Ich will auf eine XML Datei zugreifen und Schlüssel auslesen.
Bisher habe ich:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var    xml:TXMLDocument;
    Node,Node2:IXMLNode;
begin
  xml:=TXMLDocument.Create(nil);
  xml.LoadFromFile(ParamStr(0)+'a.xml');
  Node:=xml.ChildNodes['metadata'];
  Node2:=Node.ChildNodes['track'];
  //Node:=nil;
  Node:=Node2.ChildNodes['puid-list'];
  ShowMessage(Node.NodeName+':'+Node.Prefix+':'+Node.Text);
  ShowMessage(Node.XML);

Wenn ich dort aber Node was neues zuweisen will (z.b. nil oder den nächsten Wert, darum Node2 als test) dann bekomme ich "ungültige Zeigeroperation".
Was mache ich falsch? Node und Node2 ist <>nil. Werte werden korrekt ausgegeben.


jaenicke - Do 18.11.10 23:56

Ich habe den Wrapper schon lange nicht mehr benutzt, der macht ja auch nix anderes als jeden zugriff nochmal extra an die echten Funktionen zu leiten.

Ich benutze die direkte Bibliothek und dann auch sowas wie XPath. Jedenfalls geht es damit sofort so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
  xml: DOMDocument60;
  Node, Node2: IXMLDOMNode;
begin
  xml := CoDOMDocument60.Create;
  xml.load(ExtractFilePath(ParamStr(0)) + 'a.xml');
  Node := xml.selectSingleNode('metadata');
  Node2 := Node.selectSingleNode('track');
  //Node:=nil;
  Node := Node2.selectSingleNode('puid-list');
  ShowMessage(Node.NodeName + ':' + Node.Prefix + ':' + Node.Text);
  ShowMessage(Node.XML);


FaTaLGuiLLoTiNe - Fr 19.11.10 00:17


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var xml:TXMLDocument;
    Node,Node2:IXMLNode;
begin
  xml:=TXMLDocument.Create(Application);
  xml.LoadFromFile(ParamStr(0)+'a.xml');
  xml.Active:=True;
  Node:=xml.ChildNodes['metadata'];
  Node2:=Node.ChildNodes['track'];
  //Node:=nil;
  Node:=Node2.ChildNodes['puid-list'];
  ShowMessage(Node.NodeName+':'+Node.Prefix+':'+Node.Text);
  ShowMessage(Node.XML);


Probier' das mal.


jaenicke - Fr 19.11.10 06:05

Ja, das funktioniert. Dass man den Delphi-Wrapper aktiv setzen muss, wusste ich auch nicht.

Ich habe gerade nachgeschaut. Als ich den Wrapper seinerzeit statt des Originals verwendet habe, habe ich die Funktion NewXMLDocument benutzt. Die erzeugt das Objekt und setzt Active direkt auf True, deshalb hab ich davon nichts gemerkt.


Flamefire - Fr 19.11.10 12:19

Funktioniert leider nicht. mit dem Active.
Weil:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TXMLDocument.LoadFromFile(const AFileName: DOMString = '');
begin
  SetActive(False);
  if AFileName <> '' then
    FileName := AFileName;
  if FileName = '' then
    XMLDocError(SMissingFileName);
  FXMLData := '';
  SetXMLStrings('');
  SetActive(True);
end;


In welcher Unit ist die NewXMLDocument funktion deklariert?


jaenicke - Fr 19.11.10 12:31

user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
In welcher Unit ist die NewXMLDocument funktion deklariert?
In der XMLDoc, aber bei mir hat der Test mit dem obigen Quelltext dann geklappt. :nixweiss:


Flamefire - Fr 19.11.10 12:35

Ok läuft. Hier muss man anscheinend nen Owner übergeben. Das Active ist aber redundant und damit nicht nötig.
Danke

EDIT: Warum eigentlich? Wenn man nen andren Constructor verwendet, dann wird als Owner auch nil genommen. Seltsam.