Как сохранить любые новые ключи xml при десериализации строки XML в класс, изменить некоторые значения и повторно выполнить сериализацию - PullRequest
0 голосов
/ 06 февраля 2020

Вот пример кода моей проблемы.

<System.Xml.Serialization.XmlType(TypeName:="Person")>
Public Class clsXMLtest
    Public FirstName As String
    Public LastName As String
End Class

Dim x As clsXMLtest
Dim s1 As String = "<Person>
                      <FirstName>Jack</FirstName>
                      <LastName>Hill</LastName>
                   </Person>"
Dim xmlSer As New System.Xml.Serialization.XmlSerializer(GetType(clsXMLtest))
x = CType(xmlSer.Deserialize(New IO.StringReader(s1)), clsXMLtest)
x.LastName = "Pike"
Dim sw As New IO.StringWriter
xmlSer.Serialize(sw, x)
Dim s2 As String = sw.ToString


Dim s3 As String = "<Person>
                      <FirstName>Jack</FirstName>
                      <LastName>Hill</LastName>
                      <NewKey>NEW</NewKey>
                   </Person>"
x = CType(xmlSer.Deserialize(New IO.StringReader(s3)), clsXMLtest)
x.LastName = "Jack"
sw = New IO.StringWriter
xmlSer.Serialize(sw, x)
Dim s4 As String = sw.ToString

В окончательном выводе больше не содержится новый ключ NewKey
Как сохранить любые новые ключи, добавленные к исходному XML?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Использовать XmlAnyElementAttribute :

class Person
{
    ...

    // Apply the XmlAnyElementAttribute to a field
    // returning an array of XmlElement objects.
    // XmlSerializer will put all unknown elements here
    // on deserialization, and serialize them back.
    [XmlAnyElement]
    public XmlElement[] AllElements ;
}
0 голосов
/ 06 февраля 2020

Я бы изменил класс на это, добавив новое свойство, которое List(Of NewElement)

<XmlRoot("Person")>
Public Class clsXMLtest
    <XmlElement>
    Public Property FirstName As String
    <XmlElement>
    Public Property LastName As String
    <XmlElement("NewElement")>
    Public Property NewElements As List(Of NewElement)
End Class

Public Class NewElement
    <XmlAttribute>
    Public Property Name As String
    <XmlAttribute>
    Public Property Value As String
End Class

Для десериализации

Dim s3 As String = "<Person>
                        <FirstName>Jack</FirstName>
                        <LastName>Hill</LastName>
                        <NewElement Name=""NewKey"" Value=""NEW""/>
                        <NewElement Name=""OtherKey"" Value=""OTHER""/>
                    </Person>"
x = CType(xmlSer.Deserialize(New IO.StringReader(s3)), clsXMLtest)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...