Autor Beitrag
sintec
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133



BeitragVerfasst: Do 09.08.07 12:34 
Hallo,

bei meinem Tool lasse ich die config aus einer XML-Datei auslesen und stoße ab und zu auf leere Datensätze, die er dann versucht in ein String umzuwandeln und gibt mir den Fehler aus:
ausblenden Quelltext
1:
Variante des Typs (Null) konnte nicht in Typ (String) konvertiert werden					


habe schon versucht es mit einer Anfrage zu filtern, klappt aber nicht.
ausblenden Delphi-Quelltext
1:
      if setNode.ChildValues['oldname'] <> 0 then // <> '' klappt auch nicht					


So sieht der Code beim auslesen aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
setlength(config.oldname,XML.DocumentElement.ChildNodes['oldname'].ChildNodes.Count);
    oldname := XML.DocumentElement.ChildNodes['oldname'];
    for i := 0 to oldname.ChildNodes.Count - 1 do
    begin
      setNode := oldname.ChildNodes[i];
      config.oldname[i] := setNode.ChildValues['oldname'];
    end;


kann mir bitte einer helfen?
azrael_7
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 78

Windows Vista
D2005 Pers. [de]
BeitragVerfasst: Do 09.08.07 13:00 
vllt. funktioniert eine überprüfung statt mit

ausblenden Delphi-Quelltext
1:
  if setNode.ChildValues['oldname'] <> 0					


eine überprüfung auf
ausblenden Delphi-Quelltext
1:
  IXMLNode.IsTextValue  // liefert boolean					


oder
ausblenden Delphi-Quelltext
1:
  IXMLNode.NodeType = ntText					


Müsstest nur beim Lesen des Dokuments, anstatt dem ChildValue (OLEVariant) den entsprechenden Knoten abrufen...

_________________
-·- Es gibt Leute die bringen Freude, wohin sie gehen -·-
-·- und es gibt Leute, die bringen Freude, wenn sie gehen -·-
noidic
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: Do 09.08.07 14:03 
normalerweise müsste ein Vergleich mit NULL (definiert in Variants) funktionieren, habs allerdings nicht probiert.

_________________
Bravery calls my name in the sound of the wind in the night...
sintec Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133



BeitragVerfasst: Do 09.08.07 14:08 
user profile iconazrael_7 hat folgendes geschrieben:
vllt. funktioniert eine überprüfung statt mit

ausblenden Delphi-Quelltext
1:
  if setNode.ChildValues['oldname'] <> 0					


eine überprüfung auf
ausblenden Delphi-Quelltext
1:
  IXMLNode.IsTextValue  // liefert boolean					


oder
ausblenden Delphi-Quelltext
1:
  IXMLNode.NodeType = ntText					


Müsstest nur beim Lesen des Dokuments, anstatt dem ChildValue (OLEVariant) den entsprechenden Knoten abrufen...


beides funktioniert irgendwie nicht.
bekomme bei beiden:
ausblenden Quelltext
1:
Ungültige Variantenoperation					


gibts noch ne andere Möglichkeit?



user profile iconnoidic hat folgendes geschrieben:
normalerweise müsste ein Vergleich mit NULL (definiert in Variants) funktionieren, habs allerdings nicht probiert.

Was meinst du damit?
ausblenden Delphi-Quelltext
1:
 if setNode.ChildValues['oldname'] <> NULL					

er unterstreichnt mir dan das 'NULL' als Nicht deklarierter Bezeichner
noidic
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: Do 09.08.07 14:16 
hast du die unit variants eingebunden? dorten is NULL definiert.

_________________
Bravery calls my name in the sound of the wind in the night...
sintec Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133



BeitragVerfasst: Fr 10.08.07 08:35 
ups

das war der Grund :D

Danke an euch, klappt jetzt alles.
sintec Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133



BeitragVerfasst: Di 14.08.07 08:25 
Entschuldigt, dass ich das Thema wieder aktiviere, aber es klappt doch nicht alles.

habe jetzt folgenden Code um die Felder auszulesen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
setlength(config.oldname,XML.DocumentElement.ChildNodes['oldnamearr'].ChildNodes.Count);
    oldnamearr := XML.DocumentElement.ChildNodes['oldnamearr'];
    for i := 0 to oldnamearr.ChildNodes.Count - 1 do
    begin
      setNode := oldnamearr.ChildNodes[i];
      showmessage(booltostr(setNode.ChildValues['oldname'] <> NULL)); //Kontrole
      if setNode.ChildValues['oldname'] <> NULL then
      begin
        config.oldname[i] := setNode.ChildValues['oldname'];
      end;
    end;


und so sieht meine XML-Datei aus:
ausblenden volle Höhe XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
- <config>
    <jobname>test</jobname
    <trennzeichen>;</trennzeichen
    <trennzeichenanz>1</trennzeichenanz
    <newindexwrite>false</newindexwrite
    <namemaske>!(Feld1)_!(3..4)</namemaske
    <extension>.TIF</extension
    <nozeichen>ü;.;ä;ö;,; ;</nozeichen
  - <oldnamearr>
      <oldname /> 
      <oldname /> 
      <oldname /> 
      <oldname>!(3..4)</oldname
      <oldname>!(3..4)</oldname
      <oldname /> 
      <oldname /> 
      <oldname /> 
      <oldname /> 
      <oldname /> 
      <oldname /> 
      <oldname /> 
    </oldnamearr>
  - <suchenersetzen>
    - <set>
       <bezeichnung>.->_</bezeichnung
       <suchen>.</suchen
       <ersetzen>_</ersetzen
      </set>
    - <set>
        <bezeichnung>-->_</bezeichnung
        <suchen>-</suchen
        <ersetzen>_</ersetzen
      </set>
    </suchenersetzen>
  </config>


im Quellcode habe ich ne showmessage eingebaut um zu sehen wie die nachstehende Abfrage aussieht und die zeigt mir immer 'false' bzw. 0 (NULL) an.

EDIT: Das Array 'config.oldname' wir 11 Felder groß aber immer noch leer.

kann mir das mal einer erklären?
uko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220
Erhaltene Danke: 1

Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
BeitragVerfasst: Di 14.08.07 09:03 
Also auf NULL würde ich mit der Funktion VarIsNull prüfen. Schau Dir auch mal die verschiedenen VarIs... in der Unit Variants an.

gruß,
Uli
sintec Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133



BeitragVerfasst: Di 14.08.07 11:17 
so, habe mir die Unit angeguckt und einige Funktionen ausprobiert, leider hats immer noch nicht geklappt.

Folgende Funktionen habe ich ausprobiert:
VarIsNull // gibt immer 0 zurück
VarIsEmpty und VarIsClear // geben beide ständig -1 zurück

weis nicht mehr was ich weiter machen soll, damit das Ding läuft
noidic
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: Di 14.08.07 11:35 
setz mal statt

ausblenden Delphi-Quelltext
1:
2:
3:
4:
  if setNode.ChildValues['oldname'] <> NULL then
  begin 
    config.oldname[i] := setNode.ChildValues['oldname']; 
  end;


das:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
  if setNode.NodeValue <> NULL then
  begin 
    config.oldname[i] := setNode.NodeValue
  end;

_________________
Bravery calls my name in the sound of the wind in the night...
sintec Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133



BeitragVerfasst: Di 14.08.07 11:43 
user profile iconnoidic hat folgendes geschrieben:
setz mal statt

ausblenden Delphi-Quelltext
1:
2:
3:
4:
  if setNode.ChildValues['oldname'] <> NULL then
  begin 
    config.oldname[i] := setNode.ChildValues['oldname']; 
  end;


das:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
  if setNode.NodeValue <> NULL then
  begin 
    config.oldname[i] := setNode.NodeValue
  end;


perfekt, das ist das, mit der der Funktion VarIsNull

Vielen Dank an euch