【问题标题】:Deserializing an XML to a list of classes causes exception将 XML 反序列化为类列表会导致异常
【发布时间】:2021-02-16 17:20:04
【问题描述】:

我尝试了几种不同的方法,但似乎无法将 XML 反序列化为类列表。这就是我的 XML 的样子:

<?xml version="1.0" encoding="utf-8"?>
<EmployeeDataList>
  <EmployeeData>
    <IsActive>true</IsActive>
    <Id>123456</Id>
    <FullName>JOHN SMITH</FullName>
  </EmployeeData>
  <EmployeeData>
    <IsActive>true</IsActive>
    <Id>998822</Id>
    <FullName>BILL SMITH</FullName>
  </EmployeeData>
</EmployeeDataList>

我总是得到员工列表的第一个节点,所以我的 .NET 代码如下所示:

Dim empDatas = xdoc.Elements("EmployeeDataList")
Dim xempDataList As XElement = empDatas(0)

Dim serXml As New XmlSerializer(GetType(List(Of EmployeeData)))
Dim empDataList As List(Of EmployeeData) = CType(serXml.Deserialize(xempDataList.CreateReader), List(Of EmployeeData))
Debug.Print("EmployeeDatas count={0}", empDataList.Count)

我的班级看起来像:

<Serializable>
Public Class EmployeeData
    Public IsActive As Boolean
    Public Id As String
    Public FullName As String
End Class

这样的结果是异常

System.InvalidOperationException: There is an error in XML document (0, 0). ---> System.InvalidOperationException: <EmployeeDataList xmlns=''> was not expected.

只是不确定我哪里出错了。

【问题讨论】:

  • 1.您的 XML 2 中没有根元素。每个 EmployeeDataList 之后都缺少一个 &gt;
  • 那是一个错字。它已修复。
  • 您有两个顶级元素。 XML 只能有一个根元素。您需要将这些 &lt;EmployeeDataList/&gt;s 包装在包含元素中,否则您的文档无法解析为 XML。或者,可以合并那些&lt;EmployeeDataList/&gt; 元素的内容吗?看起来这就是您的代码所期望的。
  • 我想我的意思是我可以得到第一个 块没问题。错误发生在 serXml.Deserialize 上。
  • 它不是 XML,所以你不能将它反序列化为 XML。使其成为有效的 XML,然后您可以将其作为 XML 处理。

标签: .net vb.net list class deserialization


【解决方案1】:

好的,我在这里找到了答案Is it possible to deserialize XML into List<T>?

我简单地封装了列表,以便我可以给它一个不同于默认 ArrayOfEmployeeData 的名称。

<Serializable>
Public Class EmployeeDataList
    <XmlElement("EmployeeData")>'Note: No 's' so its singular and NOT plural
    Public Property EmployeeDatas As List(Of EmployeeData)
End Class

然后反序列化

Dim xempDataList As XElement = empDatas(0)
Dim serXml As New XmlSerializer(GetType(EmployeeDataList))
Dim empDataList As EmployeeDataList = CType(serXml.Deserialize(xempDataList.CreateReader), EmployeeDataList)
Debug.Print("EmployeeDatas count={0}", empDataList.EmployeeDatas.Count)

这似乎很好用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多