Zugriff auf XML Attribut

  • Hallo liebe Leute,

    kann mir bitte Jemand helfen, wie ich folgenden Attribut (wert3) innerhalb einer XML Datei auslesen kann?

    [autoit]

    <?xml version="1.0"?>
    <container>
    <wert1 v="eins" />
    <wert2 v="zwei" />
    <wert3 v="drei" />

    [/autoit]

    ich habe es mit folgem Quelltext probiert:

    [autoit]


    #Include <_XMLDomWrapper.au3>
    #Include <Array.au3>

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

    main()
    func main()
    Local $sFile = "c:\file.data"
    If FileExists($sFile) Then
    $ret = _XMLFileOpen ($sFile)
    if $ret =0 then Exit

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

    $wert = _XMLGetValue("/container/wert3")

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

    MsgBox(4096, "test", $wert)
    MsgBox(4096, "Error", _XMLError ())
    Else
    MsgBox(4096, "fehler", "not found")
    EndIf
    EndFunc

    [/autoit]

    Ergebnis:
    Die MsgBox ist leer :( , der Wert "drei" wird nicht ausgelesen :(

    wenn in der XML Datei statt

    [autoit]

    <wert3 v="drei" />

    [/autoit]

    stehen würde

    [autoit]

    <wert3>drei</wert/>

    [/autoit]

    würde es funktionieren. Diese XML Struktur habe ich leider nicht und muss auf die o.g. zugreifen.

    Danke für Eure Rückmeldungen im Voraus.

    Einmal editiert, zuletzt von o_petrov (17. Dezember 2010 um 15:20)

  • Also dafür finde ich die _XMLDomWrapper.au3 für diese simple aufgabe doch etwas überladen.

    [autoit]

    #include <String.au3>

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

    main()
    Func main()
    Local $sFile = "c:\file.data"
    If FileExists($sFile) Then
    $file = FileRead($sFile)
    $wert = _StringBetween($file,'<wert3 v="','"')
    MsgBox(4096, "test", $wert[0])
    Else
    MsgBox(4096, "fehler", "not found")
    EndIf
    EndFunc ;==>main

    [/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.

  • Hallo zusammen,

    @ AutoBert: Quellcome der includeDatei: http://code.google.com/p/my-autoit/so…rapper.au3?r=75

    @ Chip: das ist tatsächlich nur ein Beispiel, ich denke schon, dass ich bei dem XMLDomWrapper bleiben werden, da ich noch mehr Inhalte einer XML Datei abfragen möchte.

    @ Milla: mit "%" geht es leider auch nicht

    @ Pragandy: Ja, ich habe mit _XMLGETAttrib auch probiert: bekomme leider ständig "-1" zurück:

    [autoit]

    $wert = _XMLGetAttrib("container", "wert3", "v")

    [/autoit]

    und auch so

    [autoit]

    $wert = _XMLGetAttrib("container", "wert3")

    [/autoit]

    Danke für weitere Vorschläge im Voraus!

  • Kannst ja mal die UDF und die xml anhängen.
    Vielleicht finden wir dann eine Lösung ;)

    Anbei die XML Datei.
    sry, was ist UDF? Universal Disk Format meinst Du bestimmt nicht damit, oder? :)

    Gesucht ist wie gesagt der Wert "drei" auf dem Attribute "wert3".

  • Es ist die _XMLDomWrapper.au3 gemeint, das ist eine UDF.

    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.

  • Hallo

    wenn ich dieses Skript:

    Spoiler anzeigen
    [autoit]

    #include <_XMLDomWrapper.au3>
    #include <Array.au3>

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

    main()
    Func main()
    Local $sFile = "C:\Programme\AutoIt3\Examples\XMLTest.txt"
    If FileExists($sFile) Then
    $ret = _XMLFileOpen($sFile)
    If $ret = 0 Then Exit

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

    $wert = _XMLGetValue("/container/wert3")

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

    MsgBox(4096, "test", $wert)
    ConsoleWrite("Error"& _XMLError()&@CRLF)
    Else
    MsgBox(4096, "fehler", "not found")
    EndIf
    EndFunc ;==>main

    [/autoit]

    laufen lasse bekomme ich folgenden Fehlerstring in der Konsole ausgegeben:

    Zitat

    ErrorNo object passed to function _XMLGetValue

    wenn ich in das Include-File:

    [autoit]

    Func _XMLGetValue($strXPath)
    If not IsObj($objDoc) then
    _XMLError("No object passed to function _XMLGetValue")
    Return SetError(1,1,-1)
    EndIf

    [/autoit]

    schaue wird auch klar warum. Die Funktion erwartet ein Object als Ünergabeoarameter, du übergibst aber einen String,

    mfg autoBert

  • Ich würde mal beim Öffnen der Datei ansetzen.

    Code
    ; Return Value(s): On Success - 1
    ;						 On Failure - -1 and set
    ;							@Error to:
    ;								0 - No error
    ;								1 - Parse error, @Extended = MSXML reason
    ;								2 - No object


    Entweder 1 oder -1. $ret=0 dürfte hier keinen Fehler abfangen. Ich wette _XMLFileOpen() liefert dir -1 zurück. :)

  • autoBert: Nee daran liegts nicht.
    Das Objekt wird in der UDF erstellt.

    Allerdings kommt bei mir auch dieser Fehler, was auf ein "ungültiges" xml Format schließen lässt (_XMLFileOpen() => @error=1 mit deinem file).
    Woher kommt deine xml denn?

    Mit dieser hier funktioniert es z.B.

    Spoiler anzeigen

    Nur wie komme ich jetzt an die Einträge ran? :(

  • Hallo Leute,

    ich hab's hinbekommen, ich erhalte den Attributeswert zurück:

    [autoit]

    #Include <_XMLDomWrapper.au3>
    #Include <Array.au3>

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

    main()
    func main()
    Local $sFile = "c:\file.data"
    If FileExists($sFile) Then
    $ret = _XMLFileOpen ($sFile)
    if $ret = 0 then Exit

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

    $wert = _XMLGetAttrib("/container/wert3", "v")
    MsgBox(4096, "test", $wert)
    MsgBox(4096, "Error", _XMLError ())
    Else
    MsgBox(4096, "fehler", "not found")
    EndIf
    EndFunc

    [/autoit]

    Ausgabe: "drei".

    P.S. bei der XML Datei habe ich noch einen Tippfehler rausgenommen: Statt: <wert3 v="drei" /> stand da noch <wert3 v="drei">. Vielleicht deswegen kamm der Fehler beim Einlesen mit -1.