none
Xml File auslesen und Mailversand RRS feed

  • Frage

  • Hallo,

    ich möchte eine bestimmten Wert aus einem Feld aus einem XML File auslesen und diesen dann per Mail an eine Adresse schicken.

    Das Auslesen des bestimmten Tags klappt und ich kann mir den Wert auch per Konsole ausgeben lassen.

    Beim Versenden soll der Ausgelesene Wert $referenceNumber im Betreff stehen, allerdings kommt folgendes per Mail an:

    Von: edi@powershell.com
    An: admin@powershell.com

    Betreff:
    System.Xml.XmlElement System.Xml.XmlElement System.Xml.XmlElement System.Xml.XmlElement System.Xml.XmlElement System.Xml.XmlElement

    ---------------------------------------------------------------

    $scripts=[xml]( Get-Content PO20110301.xml )

    $ReferenceNumber = $scripts.SelectNodes("/Envelope/Payload/BusinessDocument/PurchaseOrder/PurchaseOrderHeader/*")

    $msg=new-Object Net.Mail.MailMessage
    $smtp=new-object Net.Mail.SmtpClient("192.168.99.99")
    $msg.From="edi@powershell.com"
    $msg.To.Add("admin@powershell.com")
    $msg.subject="$ReferenceNumber"
    $msg.body="Text"

    $smtp.send($msg)

    ---------------------------------------------------------------

    Da ich erst seit einigen Tagen mit Powershell arbeite, bräuchte ich hier kurz Hilfe.

    Danke schonmal

    Freitag, 4. März 2011 08:14

Antworten

  • Hallo,

    das Problem liegt darin, das du mit SelectNodes die Einträge der XML-Datei als Objekte (System.Xml.XmlElement) erhältst, nicht als Text.
    Hier mal ein Beispiel um den Text aus mehreren XML-Knoten in einen String zu packen:

    Für die XML-Datei:

    <?xml version="1.0"?>
    <AD>
     <GPO>
      <Name>MeineGPO1</Name>
     </GPO>
     <GPO>
      <Name>MeineGPO2</Name>
     </GPO>
    </AD>
    


    Sieht das Skript so aus:


    $subject =""
    $scripts=[xml]( Get-Content "d:\test.xml" )
    
    $ReferenceNumber = $scripts.AD.GPO
    
    foreach ($element in $ReferenceNumber) {
     $subject = $subject + " "+$element.name 
    }
    
    write-host $subject
    

    Grüße, Denniver


    http://bytecookie.wordpress.com/
    Freitag, 4. März 2011 09:58
    Moderator
  • Nun zum einen hast du mein Script nur halb übernommen und zum anderen ist deine XML-Datei anders aufgebaut. Egal, das hier würde funktionieren:

    $ReferenceNumber =""
    $scripts=[xml](Get-Content "d:\test.xml")
    
    $ReferenceNumber = $scripts.Envelope.Payload.BusinessDocument.PurchaseOrder.PurchaseOrderInformation.PurchaseOrderNumber
    
    
    $msg=new-Object Net.Mail.MailMessage
    $smtp=new-object Net.Mail.SmtpClient("192.168.96.107")
    $msg.From="edi@powershell.com"
    $msg.To.Add(admin@powershell.com)
    $msg.subject="$ReferenceNUmber"
    $msg.body="Text"
    
    $smtp.send($msg)
    

     

    wenn deine XML-Datei gültig wäre . Das ist sie aber nicht, da das <PurchaseOrderHeader> -Tag nicht geschlossen ist ( es fehlt </PurchaseOrderHeader> ) Bist du sicher, das die XML-Datei genau so aussieht?

    Grüße, Denniver


    http://bytecookie.wordpress.com/
    Freitag, 4. März 2011 14:41
    Moderator

Alle Antworten

  • Hallo,

    das Problem liegt darin, das du mit SelectNodes die Einträge der XML-Datei als Objekte (System.Xml.XmlElement) erhältst, nicht als Text.
    Hier mal ein Beispiel um den Text aus mehreren XML-Knoten in einen String zu packen:

    Für die XML-Datei:

    <?xml version="1.0"?>
    <AD>
     <GPO>
      <Name>MeineGPO1</Name>
     </GPO>
     <GPO>
      <Name>MeineGPO2</Name>
     </GPO>
    </AD>
    


    Sieht das Skript so aus:


    $subject =""
    $scripts=[xml]( Get-Content "d:\test.xml" )
    
    $ReferenceNumber = $scripts.AD.GPO
    
    foreach ($element in $ReferenceNumber) {
     $subject = $subject + " "+$element.name 
    }
    
    write-host $subject
    

    Grüße, Denniver


    http://bytecookie.wordpress.com/
    Freitag, 4. März 2011 09:58
    Moderator
  • Nein, weiterhin kommt leider der gleiche Fehler.

    Es soll nur dieser eine Wert aus der Zeile <PurchaseOrderNumber> ausgelesen werden.

    Die XML Datei sieht so aus:

    ------------------------------------------------------------------------------------------

    <Envelope>
    <Payload>
    <BusinessDocument>
    <PurchaseOrder PurchaseOrderType="BlanketOrder" PurchaseOrderStatusType="Original">
    <PurchaseOrderHeader PurchaseOrderHeaderStatusType="New">
    <PurchaseOrderInformation>
    <PurchaseOrderNumber>0003930360</PurchaseOrderNumber> 
    </PurchaseOrderInformation>
    </PurchaseOrder>
    </BusinessDocument>
    </Payload>
    </Envelope>

    ------------------------------------------------------------------------------------------

    subject =""
    $scripts=[xml]( Get-Content "C:\error\PO20110301.xml" )

    $ReferenceNumber = $scripts.Envelope.Payload.BusinessDocument.PurchaseOrder.PurchaseOrderHeader

    foreach ($element in $ReferenceNumber)
    {
     $subject = $subject + " "+$element.name
    }

    $msg=new-Object Net.Mail.MailMessage
    $smtp=new-object Net.Mail.SmtpClient("192.168.96.107")
    $msg.From="edi@powershell.com"
    $msg.To.Add(admin@powershell.com)
    $msg.subject="$ReferenceNUmber"
    $msg.body="Text"

    $smtp.send($msg)

    Freitag, 4. März 2011 13:25
  • Nun zum einen hast du mein Script nur halb übernommen und zum anderen ist deine XML-Datei anders aufgebaut. Egal, das hier würde funktionieren:

    $ReferenceNumber =""
    $scripts=[xml](Get-Content "d:\test.xml")
    
    $ReferenceNumber = $scripts.Envelope.Payload.BusinessDocument.PurchaseOrder.PurchaseOrderInformation.PurchaseOrderNumber
    
    
    $msg=new-Object Net.Mail.MailMessage
    $smtp=new-object Net.Mail.SmtpClient("192.168.96.107")
    $msg.From="edi@powershell.com"
    $msg.To.Add(admin@powershell.com)
    $msg.subject="$ReferenceNUmber"
    $msg.body="Text"
    
    $smtp.send($msg)
    

     

    wenn deine XML-Datei gültig wäre . Das ist sie aber nicht, da das <PurchaseOrderHeader> -Tag nicht geschlossen ist ( es fehlt </PurchaseOrderHeader> ) Bist du sicher, das die XML-Datei genau so aussieht?

    Grüße, Denniver


    http://bytecookie.wordpress.com/
    Freitag, 4. März 2011 14:41
    Moderator
  • hab mich bei den tags verschrieben, sry

    die Variable wird nun richtig mitgeschickt. Wenn ich Text + Variable verschicken möchte, muss ich die variable dann extra einklammern ?

    $msg.body='Order Number ($ReferenceNumber)'

    Kann ich mit diesem Script auch jede XML-Datei in dem Ordern nach suchen lassen oder muss ich hier noch eine Variable einbauen, die den Dateinamen ausliest und bei Get-Content einfügt ?

    Danke schonmal & Grüße

    Freitag, 4. März 2011 15:47
  •  Wenn ich Text + Variable verschicken möchte, muss ich die variable dann extra einklammern ?

    Nein musst du nicht. Du kannst z.B:

    $msg.body = "Dies ist die Nummer $ReferenceNumber."

    schreiben. Aber grundsätzlich in solchen Fällen: einfach ausprobieren. :) Es ist ja nicht so das was kaputt gehen könnte...

    Kann ich mit diesem Script auch jede XML-Datei in dem Ordern nach suchen lassen oder muss ich hier noch eine Variable einbauen, die den Dateinamen ausliest und bei Get-Content einfügt ?

    Sorry, bitte nochmal neu: Was möchtest du genau machen?

    Grüße, Denniver


    http://bytecookie.wordpress.com/
    Freitag, 4. März 2011 18:26
    Moderator
  • okay klappt.

    In den Ordner Error laufen XML-Dateien rein, welche nicht verarbeitet werden konnten.

    Da die Dateinamen variieren und ein Timestamp mit drinsteht, muss ich dem Script noch irgendwie sagen, dass alle XMLDateien nach diesen Werten durchsucht werden.

    -> das klappt mit folgendem Script jetzt:

    -------------------------------------------------------

    $ziel = "C:\Ziel"

    $endung = "*.xml"

    $file = Get-ChildItem $ziel -filter $endung | sort LastWriteTime -descend

    $filemail = $file | select -first 1

    $filenamefull = $filemail.fullName

    echo $filenamefull

    -------------------------------------------------------

    Jetzt wäre es nur gut, wenn alle Dateien in dem Ordner nach den Werten durchsucht werden.

    Kann man das mit einer if-Schleife und einem Dateianzahlzähler machen ?

    Habe kurz gegoogled aber auf die Schnelle nichts dazu gefunden..

    Danke

    Montag, 7. März 2011 10:53
  • $ziel = "d:\ziel"
    $endung = "*.xml"
    $counter = 0
    $files = Get-ChildItem $ziel -filter $endung -Recurse
    
    foreach ($xmlfile in $files) {
      $counter++
      $filenamefull = $xmlfile.fullName
      write-host $counter $filenamefull
    }
    

    Grüße, Denniver

    http://bytecookie.wordpress.com/
    Montag, 7. März 2011 11:25
    Moderator
  • super, geht

    danke für die Hilfe ! :-)

    Montag, 7. März 2011 11:31