diff --git a/vim/property_value.go b/vim/property_value.go
index 36523b7..eaccc83 100644
--- a/vim/property_value.go
+++ b/vim/property_value.go
@@ -17,11 +17,14 @@ type PropertyValue struct {
func (pv *PropertyValue) Value() (interface{}, error) {
vimType := pv.Type
- if getTypeInstance, ok := registry[vimType]; ok {
- v := getTypeInstance()
+ if getInstance, ok := registry[vimType]; ok {
+ v := getInstance()
- data := []byte("" + pv.Xml + "")
- err := xml.Unmarshal(data, v)
+ // We need to make sure the unmarshalled value has its vSphere type
+ // when it is not an actual XML document
+ valueXml := fmt.Sprintf(`%s`, pv.Type, pv.Xml)
+ valueBytes := []byte(valueXml)
+ err := xml.Unmarshal(valueBytes, v)
if err != nil {
return nil, err
}
diff --git a/vim/property_value_test.go b/vim/property_value_test.go
index 4a55ae1..1e83653 100644
--- a/vim/property_value_test.go
+++ b/vim/property_value_test.go
@@ -1,6 +1,7 @@
package vim
import (
+ "encoding/xml"
"fmt"
"path/filepath"
"reflect"
@@ -63,3 +64,60 @@ func TestArrayOfString(t *testing.T) {
assert(t, objs[0] == "Datacenter", fmt.Sprintf("%s != %s\n", objs[0], "Datacenter"))
assert(t, objs[1] == "Alarm", fmt.Sprintf("%s != %s\n", objs[1], "Alarm"))
}
+
+func TestUnmarshalPropertyValue(t *testing.T) {
+ tests := []struct {
+ value string
+ expType string
+ expValue string
+ }{
+ {`
+ ha-datacenter
+
+ vmFolder
+ ha-folder-vm
+
+ `,
+ "Folder",
+ "ha-folder-vm",
+ },
+ {`
+ ha-folder-vm
+
+ childEntity
+ 1
+
+ `,
+ "ArrayOfManagedObjectReference",
+ `1`,
+ },
+ }
+
+ for _, tt := range tests {
+ var obj ObjectContent
+ err := xml.Unmarshal([]byte(tt.value), &obj)
+ ok(t, err)
+
+ motype := obj.PropSet[0].Val.Type
+ movalue := obj.PropSet[0].Val.Xml
+ assert(t, motype == tt.expType, "%s != %s", motype, tt.expType)
+ assert(t, movalue == tt.expValue, "%s != %s", movalue, tt.expValue)
+ }
+}
+
+func TestFixForIssue14(t *testing.T) {
+ data := `
+ ha-datacenter
+
+ vmFolder
+ ha-folder-vm
+
+ `
+ var obj ObjectContent
+ err := xml.Unmarshal([]byte(data), &obj)
+ ok(t, err)
+ value, err := obj.PropSet[0].Val.Value()
+ ok(t, err)
+ folder := value.(*Folder)
+ assert(t, folder.Type == "Folder", "%s != %s", folder.Type, "Folder")
+}