C#如何反序列化XML到对象列表
技术百科
幻夢星雲
发布时间:2026-01-26
浏览: 次 XmlSerializer可将XML字符串反序列化为对象列表,需定义匹配的类结构并用包装类处理根容器;若XML无显式根,需手动包装或改用XDocument+LINQ to XML。
用 XmlSerializer 可以直接将 XML 字符串反序列化为对象列表,关键在于类结构要与 XML 层级和命名匹配,并正确处理根容器元素。
定义匹配的类结构
XML 中若包含多个同级子元素(如 ),需用一个“包装类”表示根节点,再用泛型 List 或数组表示子项集合。
例如,有如下 XML:
A 1 B 2
对应类应为:
public class Root
{
[XmlElement("Item")]
public List- Items { get; set; } = new();
}
public class Item
{
public string Name { get; set; }
public int Id { get; set; }
}
使用 XmlSerializer 反序列化
创建 XmlSerializer 实例时传入根类型(如 typeof(Root)),然后调用 Deserialize 方法读取 XML 流或字符串。
- 从字符串反序列化:
var xml = @""; var serializer = new XmlSerializer(typeof(Root)); using var reader = new StringReader(xml); var root = (Root)serializer.Deserialize(reader); // 获取对象列表:root.Items A 1
- 从文件反序列化:
using var fileStream = File.OpenRead("data.xml");
var root = (Root)serializer.Deserialize(fileStream);
处理常见问题
如果 XML 没有显式根容器(比如直接是多个 ),XmlSerializer 无法直接反序列化为 List,因为 XML 必须有且仅有一个根元素。
- 方案一:手动包装成合法 XML(加一层根)
- 方案二:改用
XDocument+ LINQ to XML 手动映射(更灵活)
示例(LINQ to XML 方式):
var doc = XDocument.Parse(xmlString);
var items = doc.Root?.Element("Items")
?.Elements("Item")
.Select(x => new Item
{
Name = x.Element("Name")?.Value,
Id = int.TryParse(x.Element("Id")?.Value, out var i) ? i : 0
})
.ToList();
注意命名与特性标注
默认情况下,XmlSerializer 使用属性名作为 XML 元素名。若需自定义,可用以下特性:
-
[XmlElement("CustomName")]:指定元素名 -
[XmlAttribute("id")]:将属性映射为 XML 属性 -
[XmlRoot("Root")]:指定根元素名(用于类本身) -
[XmlArray("Items")]和[XmlArrayItem("Item")]:更明确地控制集合的序列化格式
# 有一个
# 多个
# 常见问题
# 可将
# 可以直接
# 自定义
# 关键在于
# 再用
# 对象
# 泛型
# stream
# c#
# xml
# 字符串
# typeof
# 序列化
# 需用
# linq
# 正确处理
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Python 中将 ISO 8601 时间戳转换为
- Django 测试数据库表缺失与字段未创建问题的完
- PHP主流架构怎么部署到Docker_容器化流程【
- 如何用正则表达式精确匹配“start”到“end”
- php下载安装后swoole扩展怎么安装_异步框架
- 如何使用正则表达式批量替换重复的 *- 模式为固定
- 如何在 Go 应用中实现自动错误恢复与进程重启机制
- Windows家庭版如何开启组策略(gpedit.
- Win10电脑怎么设置休眠快捷键_Windows1
- php中::能用于接口静态方法吗_接口静态方法调用
- Go 语言标准库为何不提供泛型 Contains
- 如何使用Golang实现负载均衡_分发请求到多个服
- Windows10系统怎么查看运行时间_Win10
- 如何自定义Windows终端的默认配置文件?(Po
- 如何在 Go 结构体中正确初始化 map 字段
- php485支持哪些操作系统_php485跨系统支
- Windows蓝屏错误0x00000023怎么修复
- 短链接怎么用php递归还原_多层加密链接的处理法【
- Python文本编码与解码_跨平台解析说明【指导】
- Windows怎样关闭锁屏广告_Windows关闭
- Windows系统时间服务错误_W32Time服务
- Win11怎么设置ipv4地址_Windows 1
- 如何在 Go 中比较自定义的数组类型(如 [20]
- php订单日志怎么记录发货_php记录订单发货操作
- Windows10如何更改鼠标图标_Win10鼠标
- Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数
- Win11怎么关闭任务栏小图标_Windows11
- Win10如何更改开机密码_Windows10登录
- Windows的便笺功能如何使用?(桌面备忘技巧)
- Win11怎么关闭通知消息_屏蔽Windows 1
- php与c语言在嵌入式中有何区别_对比两者在硬件控
- Windows10电脑怎么设置文件权限_Win10
- 如何用::实现工具类方法调用_php静态工具类设计
- 如何使用 Selenium 正确获取篮球参考网站球
- Win11怎样安装企业微信_Win11安装企业微信
- c# 在高并发下使用反射发射(Reflection
- mac怎么退出id_MAC退出iCloud账号与A
- php嵌入式多设备通信怎么实现_php同时管理多个
- c++如何打印函数堆栈信息_c++ backtra
- c++如何实现多态性_c++ 虚函数表原理与动态绑
- Linux如何申请SSL免费证书_Linux下Ce
- 如何使用Golang实现路由参数绑定_使用Mux和
- 如何使用Golang编写单元测试_创建Test函数
- Python大型项目拆分策略_模块化解析【教程】
- Win10如何更改用户账户控制_Windows10
- php打包exe怎么传递参数_命令行参数接收方法【
- mac怎么右键_MAC鼠标右键设置与触控板手势技巧
- Python 模块的 __name__ 属性如何由
- 如何在Golang中处理模块包路径变化_Golan
- LINUX怎么查看进程_LINUX ps命令查看运


QQ客服