Programm mit auslesen einer xml

  • Hi zusammen,

    ich bin recht neu in der Nutzung mit autoit und versuche gerade mit Hilfe von autoit folgendes problem zu lösen.

    Ich möchte ein programm schreiben welches Dienste starten und schließen kann.
    Hier zu soll es eine .xml Datei geben, in der ich die Anzahl der Dienste angeben kann und deren namen

    Bsp:

    Code
    <Dienste>
       <Anzahl>3</Anzahl>
    </Dienste>
    <Dienstliste>
       <Name1>SMSBService</Name1>
       <Name2>SpeechMagic</Name2>
       <Name3>SmDdBackendServer</Name3>
    </Dienstliste>

    mein bisheriges Programm läuft, nur halt ohne auslesen einer .xml, dafür bin ich bisher irgendwie zu blöd :D


    Danke für eure Hilfe,
    Oli

  • Gibt mehrere Möglichkeiten.

    Eine wäre z.b. deine xml etwas zu ändern das überall die Tags "<Name></Name>" sind also so:

    Spoiler anzeigen
    Code
    <Dienste>
       <Anzahl>3</Anzahl>
    </Dienste>
    <Dienstliste>
       <Name>SMSBService</Name>
       <Name>SpeechMagic</Name>
       <Name>SmDdBackendServer</Name>
    </Dienstliste>

    Und dann so ausgeben:

    Spoiler anzeigen
    [autoit]

    #include <String.au3>
    $file = FileOpen("test.xml", 0)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $line = FileReadLine($file)
    If StringInStr($line,"<Name>") Then
    $dienst = _StringBetween($line,"<Name>","</Name>")
    MsgBox(0,"",$dienst[0])
    EndIf
    If @error = -1 Then ExitLoop
    Wend

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • wofür sollte ich da ne while schleife verwenden? dann läuft es ja endlos....
    Und muss ich die Datei nicht auch schließen am ende?

  • Darum ja auch "If @error = -1 Then ExitLoop". FileReadLine liefert ein @error = -1 wenn das Dateiende erreicht ist.

    Wenn du während der Laufzeit mit einem anderen Programm auf diese Datei zugreifen willst dann musst sie schließen ansonsten spar, zummindestens ich, mir das.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • denke die Lösung von chip ist ausreichend, aber nachdem er die 3 zeilen erkannt hat und mir die 3 Dienste ausgibt(testweise) wird der rest des programms nicht mehr durchlaufen, also das mit den checkboxen

  • warum führt er den code nach der while schleife nicht mehr aus. Ich find den fehler nicht :(

  • Mein Fehler, die Position der "If @error" war falsch. So gehts:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    #include <String.au3>
    $file = FileOpen("data.xml", 0)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $line = FileReadLine($file)
    If @error = -1 Then ExitLoop
    If StringInStr($line,"<Name>") Then
    $dienst = _StringBetween($line,"<Name>","</Name>")
    MsgBox(0,"",$dienst[0])
    EndIf
    Wend

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("My Dienste Handler")
    $1_CB = GUICtrlCreateCheckbox("SMSBService", 10, 10, 120, 20)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $2_CB = GUICtrlCreateCheckbox("SpeechMagic", 10, 30, 120, 20)
    $3_CB = GUICtrlCreateCheckbox("SmDdBackendServer", 10, 50, 120, 20)
    $start = GUICtrlCreateButton("Start", 10, 70, 100, 21)
    $stop = GUICtrlCreateButton("Stop", 120, 70, 100, 21)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()

    [/autoit] [autoit][/autoit] [autoit]

    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    If $msg = $start Then
    if (_getCheckboxState($1_CB)) Then
    Run(@COMSPEC & " /c net start SMSBService")
    EndIf
    if (_getCheckboxState($2_CB)) Then
    Run(@COMSPEC & " /c net start SpeechMagic")
    EndIf
    if (_getCheckboxState($3_CB)) Then
    Run(@COMSPEC & " /c net start SmDdBackendServer")
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $msg = $stop Then
    if (_getCheckboxState($1_CB)) Then
    RunWait(@COMSPEC & " /c net stop SMSBService")
    EndIf
    if (_getCheckboxState($2_CB)) Then
    RunWait(@COMSPEC & " /c net stop SpeechMagic")
    EndIf
    if (_getCheckboxState($3_CB)) Then
    RunWait(@COMSPEC & " /c net stop SmDdBackendServer")
    EndIf
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _getCheckboxState($controlID)
    Return BitAND(GUICtrlRead($controlID),$GUI_CHECKED)
    EndFunc ;==>_getCheckboxState

    [/autoit] [autoit][/autoit] [autoit]

    ;Run(@COMSPEC & " /c net start SMSBService")

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • bin wohl beim nächsten problem angelangt. Wie bekomm ich $1_CB so benannt, dass anstatt der 1 der aktuelle wert der for schleife drin ist