【问题标题】:Deserialize XML array in vb.net在 vb.net 中反序列化 XML 数组
【发布时间】:2017-03-01 05:04:01
【问题描述】:

我需要在 VB.NET 中反序列化一个 XML 文件。

我正在使用标准 XML 库。 我无法写下 vb 代码来定义以下结构:

<myvar>
    <var>...</var>
    <troublecodes>
        <troublecode>
        ...
        </troublecode>
        <troublecode>
        ....
        </troublecode>
        <statusbyte>
        ....
        </statusbyte>
        <statusbyte>
        ....
        </statusbyte>
        <statusbyte>
        ....
        </statusbyte>
    </troublecodes>
</myvar>

我的定义是:

Public Class MyVar
  <XmlElement("var")> Public name As String
  <XmlElement("troublecodes")> Public troubleCodes As TroubleCodes
End Class

Public Class TroubleCodes
<XmlArrayItem("troublecode")> Public troubleCode() As TroubleCode
<XmlArrayItem("statusbyte")> Public statusByte() As StatusByte
End Class

Public Class TroubleCode
  <XmlElement("one")> Public one As String
  <XmlElement("two")> Public two As String
End Class

Public Class StatusByte
  <XmlElement("three")> Public threeAs String
  <XmlElement("four")> Public four As String
End Class

但反序列化不会填充对象。
我该如何定义它们?

【问题讨论】:

标签: xml vb.net xml-deserialization


【解决方案1】:

我的解决办法是:

Public Class TroubleCodes  
    <XmlElement("troublecode")> Public troubleCode() As TroubleCode
    <XmlElement("statusbyte")> Public statusByte() As StatusByte
End Class

序列化变量我得到相同的XML代码。

【讨论】:

    【解决方案2】:

    通常可以通过序列化根类型的示例并将生成的 XML 与所需的 XML 进行比较来诊断反序列化中的问题。如果我使用您的 MyVar 类型(演示 fiddle)这样做,我会得到以下结果:

    <MyVar>
      <var>my name</var>
      <troublecodes>
        <troubleCode>
          <troublecode>
            <one>one</one>
            <two>two</two>
          </troublecode>
        </troubleCode>
        <statusByte>
          <statusbyte>
            <three>three</three>
            <four>four</four>
          </statusbyte>
        </statusByte>
      </troublecodes>
    </MyVar>
    

    这有以下问题:

    • 根节点大写错误。

      这可以通过将&lt;XmlRoot("myvar")&gt; 添加到您的根类型来解决。

    • &lt;troubleCode&gt; 多了一层嵌套。

      默认情况下,XmlSerializer 序列化所有集合,包括带有外部容器元素的数组。要抑制外部容器元素并将集合序列化为元素的平面序列,请将XmlArrayItem 属性替换为&lt;XmlElement("troublecode")&gt;

    • 还有一层额外的嵌套&lt;statusByte&gt;

    因此你的类型应该如下:

    <XmlRoot("myvar")> _
    Public Class MyVar
        <XmlElement("var")> Public name As String
        <XmlElement("troublecodes")> Public troubleCodes As TroubleCodes
    End Class
    
    Public Class TroubleCodes
        <XmlElement("troublecode")> Public troubleCode() As TroubleCode
        <XmlElement("statusbyte")> Public statusByte() As StatusByte
    End Class
    
    Public Class TroubleCode
        <XmlElement("one")> Public one As String
        <XmlElement("two")> Public two As String
    End Class
    
    Public Class StatusByte
        <XmlElement("three")> Public three As String
        <XmlElement("four")> Public four As String
    End Class
    

    固定fiddle

    【讨论】:

    • @SteMMo - 我将您的课程逐字复制到小提琴dotnetfiddle.net/qZaw2t 中,并看到了额外的级别。问完问题后你有没有换班?答案中的类是否会生成您需要的 XML?
    猜你喜欢
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多