2016-10-25 1 views
0

Ich versuche XML-Serialisierung in PowerShell zu lernen. Also mache ich eine einfache Kontaktliste zum Serialisieren und Deserialisieren. Das Problem, auf das ich stoße, ist, dass das Objekt Contact sich anders verhält, wenn ich es mit Import-CliXml importiere. HierWie kann ich Import-CliXml verwenden, um eine generische Liste benutzerdefinierter Klassenobjekte zu deserialisieren?

ist, was ich jetzt bin versucht:

class Contact { 
[string]$FirstName; 
[string]$LastName; 
[Int64]$PhoneNumber; } 

$bob = new-object Contact 
$bob.FirstName = "Bob" 
$bob.LastName = "Johnson" 
$bob.PhoneNumber = 1235589876 

$bill = new-object Contact 
$bill.FirstName = "Bill" 
$bill.LastName = "Carson" 
$bill.PhoneNumber = 1235589875 

$ContactList = new-object System.Collections.Generic.List[Contact] 
$ContactList.Add($bob) 
$ContactList.Add($bill) 

[xml]$data = $ContactList | convertto-xml 

new-item "C:\Users\Public\Documents\Contacts.xml" 
$data | export-clixml "C:\Users\Public\Documents\Contacts.xml" 

[xml]$ImportedData = import-clixml "C:\Users\Public\Documents\Contacts.xml" 
$ImportedList = new-object System.Collections.Generic.List[Contact] 
$ImportedList = $ImportedData.Objects.Object 

Die importierte List[Contact] eine Sammlung von Contact Objekten hat, aber ich kann nicht scheinen, um die Informationen von ihren Eigenschaften zu erhalten. Zum Beispiel, wenn ich Leerzeilen erhalten, wenn ich versuche, die folgenden:

$ImportedList | foreach-object { write-host $_.FirstName } 

Ich weiß, dass die Objekte gibt es wegen der Rückkehr I von $ImportedList erhalten:

$ImportedList 

Type Property 
---- -------- 
Contact {FirstName, LastName, PhoneNumber} 
Contact {FirstName, LastName, PhoneNumber} 

Ich versuche, es zu erhalten, Rückkehr die gleiche Sache wie $ContactList:

$ContactList 

FirstName LastName PhoneNumber 
--------- -------- ----------- 
Bob  Johnson 1235589876 
Bill  Carson 1235589875 

Jede Hilfe wäre sehr dankbar.

+0

überspringen 'ConvertTo-Xml' Schritt, Do '$ ContactList | Export-CliXml' statt –

Antwort

1

Das Problem, das Sie haben, ist bis import-clixml, es gibt keinen Objekttyp [contact] zurück. $ImportedData.Objects.Object ist anstelle des Typs [System.Xml.XmlElement], weshalb Sie leere Zeilen hier:

$ImportedList | foreach-object { write-host $_.FirstName } 

, da es keine Eigenschaft in der Pipeline firstname auf das Objekt.

Anstelle dieser zwei Linien:

$ImportedList = new-object System.Collections.Generic.List[Contact] 
$ImportedList = $ImportedData.Objects.Object 

Try this:

$ImportedList = @() 
$ImportedData.Objects.Object | %{$ImportedList += [contact]@{firstname=$_.property[0].'#text';lastname=$_.property[1].'#text';phonenumber=$_.property[2].'#text'}} 
+0

Super! Ich habe die 'PhoneNumber' -Eigenschaft zu' Int64' gecastet, und es hat wie ein Zauber funktioniert. Vielen Dank! –

0

Danke Tav für die klare Antwort. Dies ist, was ich am Ende mit:

$ImportedList = new-object System.Collections.Generic.List[Contact] 

$ImportedData.Objects.Object | foreach-object { 
$NewContact = new-object Contact 
$NewContact.FirstName = $_.Property[0].'#text' 
$NewContact.LastName = $_.Property[1].'#text' 
$NewContact.PhoneNumber = [Int64]$_Property[2].'#text' 
$ImportedList.Add($NewContact) } 

aktualisieren

konnte ich die Eigenschaftsnamen mit dem Where() Methode verwenden:

$ImportedList = new-object System.Collections.Generic.List[Contact] 

$ImportedData.Objects.Object | foreach-object { 
$NewContact = new-object Contact 
$NewContact.FirstName = $_.Property.Where({ $_.Name -eq "FirstName" }).'#text' 
$NewContact.LastName = $_.Property.Where({ $_.Name -eq "LastName" }).'#text' 
$NewContact.PhoneNumber = [Int64]$_Property.Where({ $_.Name -eq "PhoneNumber" }).'#text' 
$ImportedList.Add($NewContact) } 
Verwandte Themen