Benutzer mit den meisten Antworten
Xml File auslesen und Mailversand

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
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/- Als Antwort markiert Denniver ReiningMVP, Moderator Montag, 7. März 2011 12:03
-
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/- Als Antwort markiert Denniver ReiningMVP, Moderator Montag, 7. März 2011 12:04
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/- Als Antwort markiert Denniver ReiningMVP, Moderator Montag, 7. März 2011 12:03
-
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)
-
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/- Als Antwort markiert Denniver ReiningMVP, Moderator Montag, 7. März 2011 12:04
-
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
-
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/ -
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
-
$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/