AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi Problem mit dem einlesen einer XML-Datei
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit dem einlesen einer XML-Datei

Ein Thema von Bit Juggler · begonnen am 24. Feb 2004 · letzter Beitrag vom 3. Dez 2004
Antwort Antwort
Benutzerbild von semo
semo

Registriert seit: 24. Apr 2004
755 Beiträge
 
Delphi 2010 Professional
 
#1

Re: Problem mit dem einlesen einer XML-Datei

  Alt 3. Dez 2004, 14:35
Code:
<?xml version="1.0" standalone="yes"?>
<datapacket day="26" month="8" year="2004" hour="15" min="06" sec="32" msec="386">
    <metadata>
        <fielddefs>
            <fielddef name="Anrede" datatype="string" fieldsize="4" />
            <fielddef name="Titel" datatype="string" fieldsize="5" />
            <fielddef name="Vorname" datatype="string" fieldsize="255" />
            <fielddef name="Nachname" datatype="string" fieldsize="255" />
            <fielddef name="Positionswunsch" datatype="string" fieldsize="255" />
            <fielddef name="Strasse" datatype="string" fieldsize="255" />
            <fielddef name="PLZ" datatype="string" fieldsize="5" />
            <fielddef name="Ort" datatype="string" fieldsize="255" />
            <fielddef name="Land" datatype="string" fieldsize="255" />          
        </fielddefs>
    </metadata>  
    <recorddata>
        <field name="Anrede" value="ghj"/>
        <field name="Titel" value="ghjgj."/>
        <field name="Vorname" value="gjghjg"/>
        <field name="Nachname" value="hjghj"/>
        <field name="Positionswunsch" value="ghjgj-ghj(m/w) - Norddeutghjgjschland"/>
        <field name="Strasse" value="ghj"/>
        <field name="PLZ" value="187876190" />
        <field name="Ort" value="Gghjghjtz" />
        <field name="Land" value="Deutschland" />
    </recorddata>  
</datapacket>

wie parse ich dieses recorddata?
node.Get_nodeName --> gibt immer "field" aus
node.xml --> gibt den xml code des aktuellen Knotens aus
node.Get_text --> ist ja immer leer

wie komme ich an die "name" und "value" felder?
Über Get_NodeValue?

ich habe gesehen dass im tutorial Get_NodeValue einen String zurückliefert.
bei mir ist der rückgabewert aber vom typ oleVariant?!

hab ich da was übersehen?


hier mal mein code:
Code:
var
  node: IXMLDOMNode;
  nodes: IXMLDOMNodeList;
  sOle: OleVariant;
  s: String;
// Parsen des XML-Dokumentes
begin
  xmlDoc := CoDOMDocument30.Create;
  //xmlDoc.setProperty('NewParser', true);  --> nur für 4.0 Version!
  xmlDoc.validateOnParse   := False;
  xmlDoc.resolveExternals  := False;
  xmlDoc.async             := False;
  xmlDoc.preserveWhiteSpace := False;

  if not xmlDoc.load(sDateiname) then
    MessageDlg('XML-Datei nicht vorhanden!', mtWarning, [mbOK], 0);


  // Durchlaufen einer NodeList: -----------------------------------------------
  nodes := xmlDoc.selectNodes('//recorddata[0]/*');
  node := xmlDoc.selectSingleNode('//recorddata[0]/*');

  for i := 0 to nodes.length-1 do
  begin

    if (node <> nil) then
    begin
      node := nodes.nextNode;

      // einlesen des nodeValues, dabei ist das Ergebnis vom Typ OleVariant
      sOle := node.Get_nodeValue;

      case varType(sOle) of
        varStrArg:      ShowMessage('COM-compatible string');
        varEmpty  :    ShowMessage('The variant is Unassigned');
        varOleStr  :   ShowMessage('Reference to a dynamically allo...');
        varVariant  :  ShowMessage('A variant');
        varString  :   ShowMessage('Reference to a dynamically ...');
        varNull  :     ShowMessage('The variant is Null.');
        varSmallint  : ShowMessage('16-bit signed integer (type Sm....');
        varInteger :    ShowMessage('32-bit signed integer (type Integ...).');
        varSingle :     ShowMessage('Single-precision floating-point valu....');
        varDouble  :   ShowMessage('Double-precision floating-point value (type double).');
        varCurrency  : ShowMessage('Currency floating-point value (type Currency).');
        varDate  :     ShowMessage('Date and time value (type TDateTime).');
        varDispatch  : ShowMessage('Reference to an Automation object (an IDi....');
        varError :      ShowMessage('Operating system error code.');
        varBoolean :    ShowMessage('16-bit boolean (type WordBool).');
        varUnknown :    ShowMessage('Reference to an unknown object (an IInterface or IUnknown interface pointer).');
        varByte  :     ShowMessage('A Byte');
        varAny :        ShowMessage('A CORBA Any value.');
      end;

      {
      // wir wollen jetzt das Ergebnis vom Typ OleVariant
      // in einen String umwandeln
      iResult := VariantChangeType( sOle,
                                    sOle,
                                    0,
                                    VT_BSTR);

      // das Ergebnis der Umwandlung prüfen
      case iResult of
        S_OK: ShowMessage('Success.');
        DISP_E_BADVARTYPE: ShowMessage('The variant type vtNew ....');
        DISP_E_OVERFLOW:ShowMessage('The data pointed to by p.....');
        DISP_E_TYPEMISMATCH:   ShowMessage('The argument could not ....');
        E_INVALIDARG:   ShowMessage('One of the arguments is invalid.');
        E_OUTOFMEMORY:   ShowMessage('Memory could not be allocated for the conversion.');
      end;

      // wenn Ergebnis ok ist weiterverfahren ansonsten abbrechen
      if iResult <> S_OK then
        exit;
      }

      s := '';
      //s := VarAsType(sOle, varString);

      // If VariantChangeType did not return an error,
      // the argument could then be fetched directly from the bstrVal field of the VARIANTARG
      //s:= sOle.bstrval;


      MessageDlg( 'lfd. Nr.:        ' + #9 + IntToStr(i)       + #13#10 +
                  'Nodename:        ' + #9 + node.Get_nodeName + #13#10 + 
                  'NodeInhalt:      ' + #9 + node.xml          + #13#10 + 
                  'Get_NodeValue:   ' + #9 + s                 + #13#10 + 
                  'NodeGetText:     ' + #9 + node.Get_text,              
                  mtInformation, [mbOK], 0);
    end;

  end;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz