2014-10-30 2 views
0

У меня есть сомнения, что это возможно, но мне любопытно. Можно ли десериализовать xml таким образом, чтобы имя тега элемента использовалось для заполнения значения свойства? Например дано это XML:XML deserialize установка значения на основе тега элемента

<Test> 
    <List> 
     <Jake Type="Dog" /> 
     <Mittens Type="Cat" /> 
    </List> 
</Test> 

Может привести список, как это:

Class Animal 
    Property Name As String 
    Property Type As String 
End Class 

Name Type 
------- ------- 
Jake Dog 
Mittens Cat 
+1

хорошо, а не с классом XmlSerializer, однако, вы могли бы сделать это с помощью XmlDocumentReader – Icepickle

ответ

1

Таким образом, не с Xml Serializer, однако, вы могли бы решить эту проблему с помощью XmlReader (XmlTextReader) в следующих путь:

Class Animal 
    Public Property Name As String 
    Public Property Type As String 
End Class 

Function ReadDocument(filename As String) As List(Of Animal) 
    Dim lst As New List(Of Animal) 

    Dim doc As XmlReader 

    Using fs As FileStream = New FileStream(filename, FileMode.Open, FileAccess.Read) 
     doc = New Xml.XmlTextReader(fs) 
     While doc.Read() 
      If doc.NodeType <> XmlNodeType.Element Then 
       Continue While 
      End If 
      If Not String.Equals(doc.Name, "List") Then 
       Continue While 
      End If 
      While doc.Read() 
       If doc.NodeType = XmlNodeType.EndElement And String.Equals(doc.Name, "List") Then 
        Exit While 
       End If 
       If doc.NodeType <> XmlNodeType.Element Then 
        Continue While 
       End If 
       Dim ani As New Animal 
       ani.Name = doc.Name 
       If doc.MoveToAttribute("Type") Then 
        ani.Type = doc.Value 
        lst.Add(ani) 
       End If 
      End While 
     End While 
    End Using 

    Return lst 
End Function 

Sub Main() 
    Dim animals As List(Of Animal) = ReadDocument("./Animals.xml") 
    Console.WriteLine("{0}{1}{2}", "Name", vbTab, "Type") 
    For Each ani As Animal In animals 
     Console.WriteLine("{0}{1}{2}", ani.Name, vbTab, ani.Type) 
    Next 
    Console.ReadLine() 
End Sub 
+0

Если бы я использовал это, я думаю, мне просто нужно было бы написать собственные сериализации в terface. – Lance

+0

Ну да, он также адаптируется к вашим потребностям, он намного сложнее в его использовании, если вы действительно хотите/нуждаетесь в нем более универсальным, тогда пользовательские атрибуты могут помочь вам намного дальше ... – Icepickle

Смежные вопросы