[TXMLDoc, VCL Win32] Was sind Kindknoten in XML?
spacer
Autor Nachricht
Gerhard_S
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Do 05.01.12 08:20 
Komponente: TXMLDoc
Verwendete VCL: VCL Win32
Hallo,
ich muss XML-Dateien auslesen, die so aufgebaut sind:
ausblenden XML-Daten markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
<?xml version="1.0" encoding="UTF-8"?>
<session xmlns="http://winscp.net/schema/session/1.0" name="sessionname" start="2012-01-04T22:09:53.504Z">
<ls>
<destination value="/httpdocs/content/test" />
<files>
<file>
<filename value="meinOrdner" />
<type value="D" />
<modification value="2011-08-31T22:59:45.000Z" />
<permissions value="rwxr-x---" />
</file>
...
</files>
<result success="true" />
</ls>
</session>
Meine Frage: wie hangle ich mich zum ersten file-Eintrag durch? Ich benutze das bei Delphi mitgelieferte TXMLDocument.
Mit der Kette
ausblenden Delphi-Quelltext markieren
1:
2:
ARoot := Doc.DocumentElement;
AFileName := ARoot.ChildNodes['session'].ChildNodes['ls'].ChildNodes['destination'].ChildNodes['files'].ChildNodes[1].attributes['value'];
geht's jedenfalls nicht.

Moderiert von user profile iconNarses: XML-Tags hinzugefügt
Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic starofftopic star
Beiträge: 1671
Erhaltene Danke: 14

Windows Vista Home Premium 32Bit
RAD Studio 2009 Pro
BeitragVerfasst: Do 05.01.12 09:14 
Fehlt da in deinem Code nicht ein Kindknoten? Vielleicht klappt das:

ausblenden Delphi-Quelltext markieren
1:
AFileName := ARoot.ChildNodes['session'].ChildNodes['ls'].ChildNodes['destination'].ChildNodes['files'].ChildNodes[1].ChildNotes['filename'].attributes['value'];
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Gerhard_S Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Do 05.01.12 12:07 
user profile iconAndreas L. hat folgendes geschrieben Zum zitierten Posting springen:
Fehlt da in deinem Code nicht ein Kindknoten? Vielleicht klappt das:

ausblenden Delphi-Quelltext markieren
1:
AFileName := ARoot.ChildNodes['session'].ChildNodes['ls'].ChildNodes['destination'].ChildNodes['files'].ChildNodes[1].ChildNotes['filename'].attributes['value'];


Leider nicht: "Listenindex überschreitet das Maximum (1)" meldet Delphi. Ich vermute, dass es am Aufbau der XML-Datei liegt. Eine Abfrage auf ChildNodes.Count hat ergeben, dass nur ARoot einen Kindknoten hat, 'session', 'ls', 'destination' und 'files' melden 0 ChildNodes, obwohl 'files' mindestens einen Kindknoten hat.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 618
Erhaltene Danke: 9

Windows XP/7 Kubuntu
RAD XE2
BeitragVerfasst: Do 05.01.12 12:43 
user profile iconGerhard_S hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden Quelltext markieren
1:
2:
ARoot := Doc.DocumentElement;
AFileName := ARoot.ChildNodes['session'].ChildNodes['ls'].ChildNodes['destination'].ChildNodes['files'].ChildNodes[1].attributes['value'];

geht's jedenfalls nicht.


Weil Files kein Kind von Destination ist - Destination dient lediglich dafür Attribute zu speichern - das wird sofort wieder geschlossen. Besorg dir nen anständigen XML-Viewer, wenns nichts kosten soll, dann das XML-Notepad von Microsoft.

ausblenden Quelltext markieren
1:
2:
ARoot := Doc.DocumentElement;
AFileName := ARoot.ChildNodes['session'].ChildNodes['ls'].ChildNodes['files'].ChildNodes['file'].ChildNodes['filename'].attributes['value'];


Und wegen dem Attribut - da musst Du dir auch den Node holen in dem das Attribut steckt und nicht den Elternknoten... So sollte das eigentlich passen...
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Gerhard_S Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Do 05.01.12 13:02 
user profile iconLemmy hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext markieren
1:
2:
ARoot := Doc.DocumentElement;
AFileName := ARoot.ChildNodes['session'].ChildNodes['ls'].ChildNodes['files'].ChildNodes['file'].ChildNodes['filename'].attributes['value'];

Und wegen dem Attribut - da musst Du dir auch den Node holen in dem das Attribut steckt und nicht den Elternknoten... So sollte das eigentlich passen...

Hm, Delphi antwortet, wie es sich für ein Orakel gehört:
"Variante des Typs (Null) konnte nicht in Typ (OleStr) konvertiert werden."

Moderiert von user profile iconNarses: Zitat repariert.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 618
Erhaltene Danke: 9

Windows XP/7 Kubuntu
RAD XE2
BeitragVerfasst: Do 05.01.12 13:11 
argh... lesen sollte man können:

ausblenden Quelltext markieren
1:
AFileName := ARoot.ChildNodes['ls'].ChildNodes['files'].ChildNodes['file'].ChildNodes['filename'].attributes['value'];


Session ist ja der DocumentRoot. Deshalb darf der da nicht mehr auftauchen.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 452
Erhaltene Danke: 10

Win XP, Debian GNU/Linux
Delphi 2007 Enterprise, Java, C#
BeitragVerfasst: Do 05.01.12 13:13 
Hier mal das ganze als XML und eingerückt:
ausblenden XML-Daten markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
<?xml version="1.0" encoding="UTF-8"?>
<session xmlns="http://winscp.net/schema/session/1.0" name="sessionname" start="2012-01-04T22:09:53.504Z">
<ls>
<destination value="/httpdocs/content/test" />
<files>
<file>
<filename value="meinOrdner" />
<type value="D" />
<modification value="2011-08-31T22:59:45.000Z" />
<permissions value="rwxr-x---" />
</file>
...
</files>
<result success="true" />
</ls>
</session>
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Gerhard_S Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Do 05.01.12 13:30 
user profile iconLemmy hat folgendes geschrieben Zum zitierten Posting springen:
argh... lesen sollte man können:

ausblenden Quelltext markieren
1:
AFileName := ARoot.ChildNodes['ls'].ChildNodes['files'].ChildNodes['file'].ChildNodes['filename'].attributes['value'];


Session ist ja der DocumentRoot. Deshalb darf der da nicht mehr auftauchen.


Danke. So geht's.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home