Entwickler-Ecke

Dateizugriff - IXMLDocument: Wie kann ich eine XML-Datei einlesen?


pmw - Di 24.08.04 13:51
Titel: IXMLDocument: Wie kann ich eine XML-Datei einlesen?
Hallo!

Wie kann ich mit "IXMLDocument" eine XML-Datei auslesen? Ich möchte das Attribut eines Tags erhalten. Aber leider erhalte ich immer nur "NULL" als Rückgabewert :(

XML-Datei:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
<?xml version="1.0" encoding="ISO-8859-1"?>
<Grid_Test>
  <DEFAULTCELL Fett="0" TextAnzeigen="1" Rechtsbuendig="0" Trennline="0" LinkerRand="1" ObererRand="1" RechterRand="1" UntererRand="1"></DEFAULTCELL>
  <ROW0>
    <CELL0 Fett="1" Colspan="4"></CELL0>
    <CELL4></CELL4>
    <CELL5></CELL5>
  </ROW0>
</Grid_Test>


Delphi-Code

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure LadeXML;
var
  XML: IXMLDocument;
begin

  XML := newXMLDocument;
  XML.LoadFromFile(sXmlDatei);
  XML.DocumentElement.ReadOnly;
  XML.Active;

  // Der Inhalt der ShowMessage stimmt mit der XML-Datei überein
  ShowMessage(XML.DocumentElement.XML);
  // Fehler: Attribut = NULL :(
  ShowMessage(XML.DocumentElement.ChildNodes['Grid_Test'].ChildNodes['DEFAULTCELL'].Attributes['Fett']);

end;


Viele Grüße
pmw


opfer.der.genauigkeit - Di 24.08.04 14:30

Hi,

Ich habe mal an einem Projekt gearbeitet, indem XML- Dokumente
verwendet wurden.
Mein Partner hat damals Interfaces für die jeweiligen Nodes geschrieben.

Schau mal in der Hilfe nach IXMLNode (unit XMLIntf).

Oder auch:

Unit: XMLDoc

und versuch dich mal mit folgender Funktion.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function MyClass.LoadXML(aFileName: string): boolean;
const
  TargetNamespace = '';
begin
  try
    FDoc := LoadXMLDocument(aFileName);
    // so ungefähr
    XMLRoot := FDoc.GetDocBinding('NodeName', TNodeKlasse, TargetNamespace) as NodeInterface;  
    FLoaded := true;
  except
         ... 
  end;


// NICHT GETESTET

Mehr wüßt ich jetzt auch nicht. :roll:

Lies dich mal in die Hilfe ein, das Thema ist recht umfangreich.
Weiß aber auch nicht ob es vielleicht einfachere Möglichkeiten gibt.
end;
Moderiert von user profile iconUGrohne: Code- durch Delphi-Tags ersetzt.


UGrohne - Di 24.08.04 14:34

Versuch erstmal Dein XML richtig zu schreiben ;-):

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
<?xml version="1.0" encoding="ISO-8859-1"?>  
<Grid_Test>  
  <DEFAULTCELL Fett="0" TextAnzeigen="1" Rechtsbuendig="0" Trennline="0" LinkerRand="1" ObererRand="1" RechterRand="1" UntererRand="1"></DEFAULTCELL>  
  <ROW0>  
    <CELL0 Fett="1" Colspan="4"></CELL0>  
    <CELL4></CELL4>  
    <CELL5></CELL5>  
  </ROW0>  
</Grid_Test>

(siehe letzte Zeile)
Dein Code stimmt ansonsten.


pmw - Di 24.08.04 14:43

Zitat:
Versuch erstmal Dein XML richtig zu schreiben


Im Orginal stimmt die XML-Datei. Ich hatte die Beispiel-XML-Datei vereinfacht, da das Orginal deutlich länger ist. Dabei ist mir der Fehler passiert. Das Problem ist damit leider noch nicht behoben.


UGrohne - Di 24.08.04 17:41

Beim ersten richtig hingeguckt, beim zweiten Code-Ausschnitt natürlich nicht:

Delphi-Quelltext
1:
2:
XML.DocumentElement.ReadOnly;   
XML.Active;

Das funktioniert nicht, weil das Eigenschaften sind, Du musst ihnen true oder false zuweisen. Somit hat er das Dokument auch nicht geparst und dann ist es logisch, dass da NULL rauskommt.

Delphi-Quelltext
1:
2:
  XML.DocumentElement.ReadOnly:=true;   
  XML.Active:=true;


Freez - Di 07.09.04 22:57

hmm war doch schon fast richtig ...


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure LadeXML;   
var   
  XML: IXMLDocument;   
begin   

  XML := newXMLDocument;   
  XML.LoadFromFile(sXmlDatei);  
  XML.DocumentElement.ReadOnly := true; // oder false   
  XML.Active := true; // sollte sich nicht zu false ergeben ...   

  ShowMessage(XML.DocumentElement.XML);   

  ShowMessage(XML.DocumentElement.ChildNodes['DEFAULTCELL'].Attributes['Fett']);   
//ChildNodes['Grid_Test']. <--- war zu viel ....
end;


Ich hoffe das die erklärung stimmt ... :)
Aber wenn mich nicht alles täuscht dann hast du in deiner xml Datei ein root Element, das auch nur ein mal vorkommen darf.
Das ist bei dir <Grid_Test>
mit XML.DocumentElement öffnest du dieses Element. wenn du dann auf "ChildNodes['Grid_Test']" zugreifst dann machst du das quasi doppelt.
Ich hoffe das das so richtig ist...