2011-10-03 74 views
0

我有這樣的XML:XML序列化 - 有什麼不對的

<?xml version="1.0" encoding="utf-8"?> 
<session xmlns="http://winscp.net/schema/session/1.0" name="[email protected]" start="2011-10-03T15:09:30.481Z"> 
    <ls> 
    <destination value="/incoming/monthly" /> 
    <files> 
     <file> 
     <filename value="2.txt" /> 
     <type value="D" /> 
     <modification value="2011-09-14T12:58:26.000Z" /> 
     <permissions value="rwxr-xr-x" /> 
     </file> 
     <file> 
     <filename value="3.txt" /> 
     <type value="D" /> 
     <modification value="2011-01-03T22:04:55.000Z" /> 
     <permissions value="rwxr-xr-x" /> 
     </file> 
    </files> 
    <result success="true" /> 
    </ls> 
</session> 

我下面的表示是:

<XmlRoot("session", Namespace:="http://winscp.net/schema/session/1.0")> 
    Class XMLSession 
     <XmlElement("ls/files/file")> 
     Public Property FileList As New List(Of XMLFile) 
    End Class 

<XmlType("file")> 
    Class XMLFile 
     <XmlElement("filename")> 
     Public Property FileName As XMLValueAttribute 
     <XmlElement("type")> 
     Public Property TypeName As XMLValueAttribute 
     <XmlElement("permissions")> 
     Public Property Permissions As XMLValueAttribute 
     <XmlElement("modification")> 
     Public Property ModificationDate As XMLValueAttribute 
    End Class 

    Class XMLValueAttribute 
     <XmlAttribute("value")> 
     Public Property Value As String 
    End Class 

爲什麼XMLSession.FileList.Count始終爲0。我假設它與上面的聲明有關,但我不確定它有什麼問題。也許它不能接受一條路,如果沒有,我該怎麼辦?

+0

您的XML格式是否已修復?它看起來可以使用一些工作。例如,代替'',類似於''會更有意義 - 它看起來像所有的子元素只有一個價值。如果你做了這個改變,你的序列化也會變得更容易。 –

+0

這種格式是由WinSCP生成的,所以我無法控制它 – Denis

回答

4

您無法用單個XmlElementAttribute描述多個級別的XML。你需要每個級別的課程。

+0

有沒有辦法避免每個類都有類? – Denis

+0

@marc_s:你的評論並不完全正確。例如,如果使用,則不需要「文件」類。現在,如果只有我不需要「Ls」類 – Denis

4

如果你不想建立手工類,你可以得到的工具來爲你做它:

假設你的XML保存在data.xml

xsd.exe data.xml 

這會給你data.xsd它定義了XML。

xsd.exe /l:VB /n:SomeNamespace /c data.xsd 

這會給你一個的CodeFile data.vb與定義你的類型,你可以添加到您的項目。

問題在於這個問題存在某種bug,described here,當你圍繞這個新類型創建一個序列化器時會引發錯誤。因此,您只需在生成的代碼上進行一次手動調整,即可更改:

<XmlArrayItemAttribute("file", GetType(sessionLSFilesFile), IsNullable:=False)> _ 
'To 
<XmlArrayItemAttribute("file", GetType(sessionLSFilesFile()), IsNullable:=False)> _ 
+0

希望我在開始之前就知道這個問題;-)謝謝 – Denis

+0

@Denis:這些都在文檔中。 –