You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET序列化List<CustomerDetails>时为XML节点添加属性的可行方案

如何在XML序列化时将类属性转为XML元素的属性?

你目前通过XmlSerializer序列化List(Of CustomerDetails)集合,代码如下:

Private Sub CustomerDetailsExportToXml(Details As System.Collections.Generic.List(Of CustomerDetails))
    Dim x As New System.Xml.Serialization.XmlSerializer(Details.GetType)
    Using s As New FileStream("customerdetails.xml", FileMode.Create)
        x.Serialize(s, Details)
    End Using
End Sub

得到的XML输出中,Acronym是CustomerDetails的子元素:

<?xml version="1.0"?>
<ArrayOfCustomerDetails xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <CustomerDetails>
    <Acronym>MSD</Acronym>
    <FriendlyName>Main Street Diner</FriendlyName>
  </CustomerDetails>
</ArrayOfCustomerDetails>

你希望将Acronym转为CustomerDetails元素的属性(即<CustomerDetails Acronym="MSD">),且担心序列化后修改XML会导致反序列化失败——完全可以在序列化时直接实现这个需求,不需要后续修改XML。

解决方案:给类属性添加XmlAttribute特性

只需要在CustomerDetails类的Acronym属性上标记<XmlAttribute>特性,XmlSerializer就会自动将该属性序列化为XML元素的属性,同时完全兼容反序列化。

修改后的CustomerDetails类代码:

Imports System.Xml.Serialization

Public Class CustomerDetails
    <XmlAttribute>
    Public Property Acronym As String
    
    Public Property FriendlyName As String
End Class

最终序列化结果

使用你原有的序列化代码,生成的XML会变成:

<?xml version="1.0"?>
<ArrayOfCustomerDetails xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <CustomerDetails Acronym="MSD">
    <FriendlyName>Main Street Diner</FriendlyName>
  </CustomerDetails>
</ArrayOfCustomerDetails>

说明

  • 这种方式不需要修改任何序列化逻辑,原有的CustomerDetailsExportToXml方法可以直接复用。
  • 反序列化时,XmlSerializer会自动识别CustomerDetails元素的Acronym属性,并映射回类的Acronym属性,不会出现兼容性问题。

内容的提问来源于stack exchange,提问作者DWRoelands

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:43:13