2011-10-03 59 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:这些都在文档中。 –