使用 XmlSerializer 将 XML 反序列化为类型

Posted

技术标签:

【中文标题】使用 XmlSerializer 将 XML 反序列化为类型【英文标题】:Deserializing XML to a type with XmlSerializer 【发布时间】:2020-12-09 23:38:00 【问题描述】:

我有下面的示例 XML 和 .NET 类型,我认为这是 XMLSerializer 要使用的类型的正确属性,但我只是在我的类型中返回空值。我在不同的地方尝试了各种属性,但我无法填充类型。

[<CLIMutable>]
[<XmlTypeAttribute("ROW")>]
type MyItem =
     Id: string
      At: string
      Latitude: double
      Longitude: double
      RegNum: string 

[<CLIMutable>]
[<XmlTypeAttribute(AnonymousType = true)>]
type MyRowset =
     [<XmlArrayAttribute("ROW")>]
      items: MyItem [] 

[<CLIMutable>]
[<XmlTypeAttribute("ROWSET")>]
type Myresult =
     [<XmlElementAttribute("ROWSET")>]
      rowset: MyRowset 

[<CLIMutable>]
[<XmlTypeAttribute(AnonymousType = true)>]
[<XmlRootAttribute(Namespace = "", IsNullable = false, ElementName = "RESPONSE")>]
type MyResponse =
     [<XmlElementAttribute("RESULT")>]
      result: Myresult 

    
//<RESPONSE>
//    <RESULT>
//        <ROWSET>
//            <ROW>
//            </ROW>
//        </ROWSET>
//    </RESULT>
//</RESPONSE>

【问题讨论】:

【参考方案1】:

我更新了 MyRowset 类型,现在类型如下:

<CLIMutable>]
[<XmlTypeAttribute("ROW")>]
type MyItem =
     
      Id: string
      At: string
      Latitude: double
      Longitude: double
      RegNum: string 

[<CLIMutable>]
[<XmlTypeAttribute(AnonymousType = true)>]
type MyRowset =
     [<XmlElement("ROW")>]
      items: MyItem array 

[<CLIMutable>]
[<XmlTypeAttribute("ROWSET")>]
type Myresult =
     [<XmlElementAttribute("ROWSET")>]
      rowset: MyRowset 

[<CLIMutable>]
[<XmlTypeAttribute(AnonymousType = true)>]
[<XmlRoot(Namespace = "", IsNullable = false, ElementName = "RESPONSE")>]
type MyResponse =
     [<XmlElementAttribute("RESULT")>]
      result: Myresult 

XML 示例

<RESPONSE>
    <RESULT>
        <ROWSET>
            <ROW>
                <Id>Id1</Id>
                <At>ATTT</At>
                <Latitude>1.0</Latitude>
                <Longitude>2.0</Longitude>
                <RegNum>test</RegNum>
            </ROW>
        </ROWSET>
    </RESULT>
</RESPONSE>

输出

result: result =  rowset =  items = [| Id = "Id1"
                                    At = "ATTT"
                                    Latitude = 1.0
                                    Longitude = 2.0
                                    RegNum = "test" |]   

【讨论】:

以上是关于使用 XmlSerializer 将 XML 反序列化为类型的主要内容,如果未能解决你的问题,请参考以下文章

使用 XmlSerializer 将空 xml 属性值反序列化为可为空的 int 属性

使用 XmlSerializer 时如何向 XML 文件写入注释?

无法使用 c# xmlserializer 反序列化以前序列化的 XML

XmlSerializer C# - 对象传递的简单值被转换并显示为 xml 文件中的科学值

C# Xmlserializer 将列表反序列化为 0 而不是 null

使用 XmlSerializer 重命名平面 xml 数组中的数组项