2015-11-26 4 views
0

Я изменяю приложение VB.NET для использования XmlSerializer вместо XMLDocument для чтения/записи в файл настроек XML и сохранения обратной совместимости.Deserialize Существующий XML-файл в VB.NET

Вот пример содержимого XML-файла:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <appSettings> 
    <postHistory> 
     <postFile>a.txt</postFile> 
     <postFile>b.txt</postFile> 
     <postFile>c.txt</postFile> 
    </postHistory> 
    </appSettings> 
    <SettingsPath>d.txt</SettingsPath> 
</configuration> 

Вот классы я придумал, что правильно десериализации исходный файл.

Imports System.Xml.Serialization 
Imports System.Collections.Generic 

<XmlRoot("configuration")> 
Public Class LocalSettings 
    <XmlElement("appSettings")> 
    Public appSettings As New postHistory() 
    Public SettingsPath As String = "" 
End Class 

Public Class postHistory 
    Public postHistory As New SubSettings() 
End Class 

Public Class SubSettings 
    <XmlElement("postFile")> 
    Public postHistory As New List(Of String) 
End Class 

Это код, используемый для десериализации файла:

Public Shared Function GetLocalSettings(ByVal filePath As String) As LocalSettings 
    Dim lSettings As New LocalSettings() 

    Try 
     Dim xs As New XmlSerializer(GetType(LocalSettings)) 
     Using fs As New FileStream(filePath, FileMode.Open) 
     lSettings = xs.Deserialize(fs) 
     End Using 
    Catch ex As Exception 
     ' Handle exception 
    End Try 

    Return lSettings 
    End Function 

Это решение работает, но чувствует себя неловко. Есть ли более оптимальный способ де-сериализации, который не требует вложения списка «postHistory» в двух подклассах?

+0

Что генерирует этот XML? Кажется, что у него есть стандартный файл app.config, пока вы не дойдете до содержимого 'appSettings'. Возможно, что есть лучший способ сделать это, но на ум приходит на ум две вещи: 1) это происходит, потому что это то, что представляет собой макет вашего XML, а XMLDeserializer наивна, ожидая создания объекты на основе структуры XML; и 2) Он работает, я бы пошел с этим. – Adrian

+0

Только если вы измените xml и удалите тег posthistory. – jdweng

+0

Благодарим вас за предложения обратной связи. Я хочу, чтобы решение было максимально простым, и просто искал любые альтернативы в рамках .NET-сериализации. – gotorg

ответ

0

Вы можете использовать XmlArrayAttribute(string name), чтобы указать, что список должен быть сериализован на двух уровнях, при этом внешний элемент контейнера имеет указанное имя. Затем вы можете использовать XmlArrayItemAttribute(string name), чтобы указать имя внутреннего элемента.

Таким образом:

<XmlRoot("configuration")> 
Public Class LocalSettings 
    <XmlElement("appSettings")> 
    Public appSettings As New postHistory() 
    Public SettingsPath As String = "" 
End Class 

Public Class postHistory 
    <XmlArray("postHistory")> 
    <XmlArrayItem("postFile")> 
    Public postHistory As New List(Of String) 
End Class 

Это позволяет SubSettings класс должен быть устранен.

Образец fiddle.

Для получения дополнительной информации см. Controlling XML Serialization Using Attributes.

+0

Это синтаксис, который я искал, спасибо! Прекрасно работает! – gotorg

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