none
XML Node auslesen RRS feed

  • Frage

  • Hallo, 

    ich stehe von dem Problem, dass ich aus einer XML-Datei ein Child-Object (Node) auslesen muss. Die XML-Datei sieht wie folgt aus: 

    <ArrayOfAmagnoDB.Property xmlns="http://schemas.datacontract.org/2004/07/Amagno.Base" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <AmagnoDB.Property>
    <Caption>Ersteller</Caption>
    <Value>Hans Müller</Value>
    </AmagnoDB.Property>
    <AmagnoDB.Property>
    <Caption>Bearbeiter</Caption>
    <Value>Hans Müller</Value>
    </AmagnoDB.Property>
    <AmagnoDB.Property>
    <Caption>Erstellungsdatum</Caption>
    <Value>18.07.2017 12:30</Value>
    </AmagnoDB.Property>
    <AmagnoDB.Property>
    <Caption>Bearbeitungsdatum</Caption>
    <Value>29.07.2017 13:31</Value>
    </AmagnoDB.Property>
    <AmagnoDB.Property>
    <Caption>Dateierstellungsdatum</Caption>
    <Value>17.07.2017 11:06</Value>
    </AmagnoDB.Property>
    <AmagnoDB.Property>
    <Caption>Dateibearbeitungsdatum</Caption>
    <Value>17.07.2017 11:07</Value>
    </AmagnoDB.Property>
    <AmagnoDB.Property>
    <Caption>Dateiversion</Caption>
    <Value>0</Value>
    </AmagnoDB.Property>
    <AmagnoDB.Property>
    <Caption>Dokumentennummer</Caption>
    <Value>329</Value>
    </AmagnoDB.Property>
    <AmagnoDB.Property>
    <Caption>Archivendedatum</Caption>
    <Value/>
    </AmagnoDB.Property>
    <AmagnoDB.Property>
    <Caption>Land</Caption>
    <Value>Rumänien</Value>
    </AmagnoDB.Property>
    <AmagnoDB.Property>
    <Caption>Produziert durch</Caption>
    <Value>PaperPort 14</Value>
    </AmagnoDB.Property>
    <AmagnoDB.Property>
    <Caption>Kundennummer</Caption>
    <Value>12735</Value>
    </AmagnoDB.Property>
    </ArrayOfAmagnoDB.Property>

    Ich möchte einige <Value> - Werte bekommen. Das ist mein bisheriger Code in PowerShell: 

    $xml = [XML](get-content $env:temp\test.xml)
    $xml.'ArrayOfAmagnoDB.Property'.'AmagnoDB.Property'

    Vielen 1000 Dank für Eure Hilfe!!!! 

    Samstag, 29. Juli 2017 13:24

Antworten

  • Es ist immer empfehlenswert, die Hilfe der cmdlets zu lesen, die man benutzt - wirklich komplett mit Beispielen. Dann lernt man, welche Parameter verfügbar sind und was sie tun. Bei Select-Object z.B. gibt es kein -HideTableHeaders. Aber es gibt ein -ExpandProperty, welches Dir in diesem Fall hilft Dein Ziel zu erreichen:

    $xml.'ArrayOfAmagnoDB.Property'.'AmagnoDB.Property' | 
        Where-Object {$_.Caption -eq 'Bearbeiter'} | 
            Select-Object -ExpandProperty Value -OutVariable Bearbeiter
    
    $Bearbeiter
    

    ... oder Du packst die Variablenzuweisung an den Anfang:

    $Bearbeiter = $xml.'ArrayOfAmagnoDB.Property'.'AmagnoDB.Property' | 
        Where-Object {$_.Caption -eq 'Bearbeiter'} | 
            Select-Object -ExpandProperty Value -OutVariable 
    
    $Bearbeiter
    

    Wenn Du Dich länger/öfter mit Powershell beschäftigen möchtest/musst, empfehle ich Dir, Dir die Grundlagen von Powershell und wie man es benutzt und wie man das integrierte Hilfesystem benutzt, zu lernen. Am besten strukturiert mit einem Buch, oder einem Kurs, oder ein Online-Tutorial .... das macht Dir das Leben viel leichter als sich z.B. immer nur Codeschnipsel zusammen zu googlen. Hier sind ein paar gute Quellen verlinkt: Beginner Sites and Tutorials

    Wenn Dir eine Anwort hier geholfen hat, markiere sie doch bitte entsprechend. Das hilft anderen, die Lösung schneller zu finden.


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    • Als Antwort markiert Jan Sandritis Sonntag, 30. Juli 2017 07:22
    Sonntag, 30. Juli 2017 02:42

Alle Antworten

  • Na dann erst mal Willkommen im deutschen Powershell Forum.  ...  und auch gleich eine Bitte: Wenn Du hier Code postest, formatier diesen bitte entsprechend als Code. Das bietet sich auch für Ausschnitte aus Dateien an, da dabei das Originalformat bewahrt wird ...  Zeilenumbrüche und so - das macht es uns allen einfacher.

    So - jetzt zu Deinem Code - was ist die Frage? Du möchtest "einige" Werte bekommen? Welche? Warum und Wozu? ;-) Wenn Du nur die Werte möchtest, selektierst Du sie:

    $xml = [XML](get-content $env:temp\test.xml -Encoding UTF8)
    $xml.'ArrayOfAmagnoDB.Property'.'AmagnoDB.Property' | 
        Select-Object -Property Value

    ... oder so:

    $xml.'ArrayOfAmagnoDB.Property'.'AmagnoDB.Property'.Value

    ... oder wenn Du nur bestimmte willst, filterst Du genau diese heraus:

    .....
    $xml.'ArrayOfAmagnoDB.Property'.'AmagnoDB.Property' | 
        Where-Object {$_.Caption -eq 'Bearbeiter' -or $_.Caption -eq 'Dokumentennummer'} | 
            Select-Object -Property Value



    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''



    • Bearbeitet BOfH-666 Samstag, 29. Juli 2017 15:27
    Samstag, 29. Juli 2017 14:58
  • Super, das ist genau was ich gesucht habe - vielen Dank für die schnelle Antwort!!! 

    Ich will den Wert in einer Variablen speichern, daher stören die Überschriften etwas. Gibt es eine Möglichkeit diese auszuschalten? Den Schalter -HideTableHeaders hab ich schon probiert, wirft aber eine Fehlermeldung raus... 

    Samstag, 29. Juli 2017 22:28
  • Es ist immer empfehlenswert, die Hilfe der cmdlets zu lesen, die man benutzt - wirklich komplett mit Beispielen. Dann lernt man, welche Parameter verfügbar sind und was sie tun. Bei Select-Object z.B. gibt es kein -HideTableHeaders. Aber es gibt ein -ExpandProperty, welches Dir in diesem Fall hilft Dein Ziel zu erreichen:

    $xml.'ArrayOfAmagnoDB.Property'.'AmagnoDB.Property' | 
        Where-Object {$_.Caption -eq 'Bearbeiter'} | 
            Select-Object -ExpandProperty Value -OutVariable Bearbeiter
    
    $Bearbeiter
    

    ... oder Du packst die Variablenzuweisung an den Anfang:

    $Bearbeiter = $xml.'ArrayOfAmagnoDB.Property'.'AmagnoDB.Property' | 
        Where-Object {$_.Caption -eq 'Bearbeiter'} | 
            Select-Object -ExpandProperty Value -OutVariable 
    
    $Bearbeiter
    

    Wenn Du Dich länger/öfter mit Powershell beschäftigen möchtest/musst, empfehle ich Dir, Dir die Grundlagen von Powershell und wie man es benutzt und wie man das integrierte Hilfesystem benutzt, zu lernen. Am besten strukturiert mit einem Buch, oder einem Kurs, oder ein Online-Tutorial .... das macht Dir das Leben viel leichter als sich z.B. immer nur Codeschnipsel zusammen zu googlen. Hier sind ein paar gute Quellen verlinkt: Beginner Sites and Tutorials

    Wenn Dir eine Anwort hier geholfen hat, markiere sie doch bitte entsprechend. Das hilft anderen, die Lösung schneller zu finden.


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    • Als Antwort markiert Jan Sandritis Sonntag, 30. Juli 2017 07:22
    Sonntag, 30. Juli 2017 02:42
  • Hallo! Das funktioniert!!! So ist nur der Wert in der Variablen. Vielen, vielen Dank!!! Ich hätte nicht gedacht das es SO einfach ist! Ich bestelle mir sofort ein Buch, schau mir den Link an und werde mich in die Materie einarbeiten - bis dahin VIELEN DANK!!! Ihr habt mir gerade Nächstelange frustrierendes "Trial & Error" erspart ;-)
    Sonntag, 30. Juli 2017 07:21
  • Für alle, die auch diese Lösung benötigen noch ein Hinweis: Ihr müsst die Variable $XML zuweisen. Im Beispiel unten ist $env:temp die aus MS-DOS/CMD bekannte Umgebungsvariable %temp% (Temporäres Verzeichnis des Benutzers). 

    $xml = [XML](get-content $env:temp\amagno.xml)
    #Variante 1 mit Variablen $Kundennummer vorne 
    $Kundennumer = $xml.'ArrayOfAmagnoDB.Property'.'AmagnoDB.Property'|Where-Object {$_.Caption -eq 'Kundennummer'}|Select-Object -ExpandProperty Value 
    #Variante 2 mit Variable $Kundennummer hinten
    $xml.'ArrayOfAmagnoDB.Property'.'AmagnoDB.Property'|Where-Object {$_.Caption -eq 'Kundennummer'}|Select-Object -ExpandProperty Value -OutVariable Kundennummer
     


    Sonntag, 30. Juli 2017 07:34