Ich habe eine XML mit diesem allgemeinen Format erstellt und habe Schwierigkeiten zu speichern Attribute:Speicher Attribute auf XML in VB.Net
<?xml version="1.0">
-<Report>
-<Class Name="ClassA">
<Property Name="Property1" dType="Boolean">False</Property>
</Class>
-<Class Name="ClassB">
-<Property Name="Property2" dType="SortedList`2" Value="String" Key="Int16">
<SrtLstItm Key="1">94</SrtLstItm>
</Property>
<Property Name="Property3" dType="Int32">1</Property>
-<Property Name="Property4" dType="List`1" Type="Product">
<LstItm Name="Property4">LstItm1</LstItm>
<LstItm Name="Property4">LstItm2</LstItm>
</Property>
</Class>
-<Class Name="ClassC">
<Property Name="Property5" dType="String">50.5</Property>
</Class>
</Report>
Was ich bin interessiert dabei verwendet XMLTextReader Klassennamen zu speichern, um sie liest durch die Eigenschaften es hat immer noch Klasseninformationen. Ich bin derzeit mit Select Case von NodeType:
Dim xrdr = New System.Xml.XmlTextReader(fileName)
Do While (xrdr.Read())
Select Case xrdr.NodeType
Case XmlNodeType.Element 'Display beginning of element.'
Select Case xrdr.Name
Case xrdr.Name = "Class"
cls = xrdr.GetAttribute("Name")
Case xrdr.Name = "Property"
propertyName = xrdr.GetAttribute("Name")
Case xrdr.Name = "SrtListItm"
srtLstKey = xrdr.GetAttribute("Key")
End Select
If xrdr.HasAttributes Then 'If attributes exist'
While xrdr.MoveToNextAttribute()
''Display attribute name and value.
End While
End If
Case XmlNodeType.Text 'Display the text in each element.'
vle = xrdr.ReadString
Case XmlNodeType.EndElement 'Display end of element.'
End Select
Loop
xrdr.Close()
Ich plane, den Code über die Verwendung der öffentlichen Eigenschaften jeder Klasse mit aktualisierten Werte in der XML gegeben zu aktualisieren. Davor hatte ich das XML, also hatte jede Eigenschaft ein Klassenattribut und der Code konnte alle Eigenschaften lesen und aktualisieren, die keine Kinder hatten. Ich umstrukturiere es, um Eigenschaften des Array-Typs zu berücksichtigen. Jede Hilfe wäre willkommen und ich danke Ihnen für Ihre Zeit.
Update: mit der Lösung veröffentlicht, kam ich mit dem folgenden. Aus dem obigen Code konnte ich alle Nicht-Array-Eigenschaften einlesen. Jetzt versuche ich die Werte von den Kindern zu importieren.
Dim xrdr = New System.Xml.XmlTextReader(fileName)
Do While (Not xrdr.EOF)
xrdr.ReadToFollowing("Class")
If (Not xrdr.EOF) Then
Dim _class As XElement = XElement.ReadFrom(xrdr)
Dim cls As String = _class.Attribute("Name")
For Each _property As XElement In _class.Elements("Property")
Dim propertyName As String = _property.Attribute("Name")
fInfo = ps.GetType().GetField("_" & cls,
System.Reflection.BindingFlags.NonPublic Or
System.Reflection.BindingFlags.Instance Or
System.Reflection.BindingFlags.Public Or
System.Reflection.BindingFlags.IgnoreCase)
'Use the FieldInfo to retrieve the sub-class the matches the cls variable.'
obj = fInfo.GetValue(object)'Object created before read'
'Using reflection, get the PropertyInfo of the Property that matches'
'the text in the nme variable.'
pInfo = obj.GetType.GetProperty(propertyName)
If pInfo Is Nothing Then
Else
Dim pInfoType = pInfo.PropertyType.Name
If pInfoType = "SortedList`2" Then
For Each _child As XElement In _property.Elements("SrtLstItm")
Dim childName As String = _child.Attribute("Key")
pInfo = obj.GetType.GetProperty(childName)
tmpVal = CTypeDynamic(_child.Value, pInfo.PropertyType)
pInfo.SetValue(obj, tmpVal, Nothing)
Next
ElseIf pInfoType = "List`1" Then
ElseIf pInfoType = "Product" Then
Else
'Convert the value (vle) to the type of the Property to which
'it will be assigned. CTypeDynamic must be used so that the
'type retrieved from pInfo can be used.
tmpVal = CTypeDynamic(_property.Value, pInfo.PropertyType)
'Use the PropertyInfo to set the value of the property
'that matches nme.
pInfo.SetValue(obj, tmpVal, Nothing)
End If
End If
Next _property
End If
Loop
Ich bin ein wenig vertraut mit linq. Von Ihrem Code kann ich _property.value bekommen, aber im Falle von sortierten Listen und Listen, wie bekomme ich diese multiplen Werte? –
Ich habe den Code aktualisiert. Das ist in C# so viel einfacher. – jdweng