Autor Beitrag
pmw
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65



BeitragVerfasst: Di 24.08.04 13:51 
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:
ausblenden 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
ausblenden 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


Zuletzt bearbeitet von pmw am Di 24.08.04 14:40, insgesamt 1-mal bearbeitet
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: 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.

ausblenden 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.

_________________
Stellen Sie sich bitte Zirkusmusik vor.
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Di 24.08.04 14:34 
Versuch erstmal Dein XML richtig zu schreiben ;-):
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Di 24.08.04 17:41 
Beim ersten richtig hingeguckt, beim zweiten Code-Ausschnitt natürlich nicht:
ausblenden 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.
ausblenden Delphi-Quelltext
1:
2:
  XML.DocumentElement.ReadOnly:=true;   
  XML.Active:=true;
Freez
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Di 07.09.04 22:57 
hmm war doch schon fast richtig ...

ausblenden 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...