XML 转 C# 类(XmlSerializer)
根据 XML 生成适用于 XmlSerializer 的 C# 类:XmlRoot、XmlElement、XmlAttribute、XmlText 特性,重复元素对应 List<T>,并推断类型。
XmlSerializer 不能对属性使用可空值类型,因此可选的数字、bool 或日期属性会附带一个 …Specified 属性,用来告诉你该属性是否存在。
仅含日期的值(2000-10-01)使用 DataType = "date",这样 XmlSerializer 读写时就不会带时间。
要用 .NET 的 XmlSerializer 把 XML 读成对象,你需要一些特性与文档严格对应的类:根元素用 [XmlRoot],子元素用 [XmlElement],属性用 [XmlAttribute],与属性并存的文本用 [XmlText]。粘贴一份示例文档,就能得到这些类:重复的元素变成 List<T>,数字、布尔值和日期会被指定类型,可选值按 XmlSerializer 的要求处理,命名空间也会被保留。
使用方法
- 粘贴一份有代表性的 XML 文档——在某处包含可选元素和重复元素。
- 可选:输入 C# 命名空间。
- 选择是否为值指定类型(int、decimal、bool、DateTime),还是保持为字符串。
- 复制这些类,并用 new XmlSerializer(typeof(Root)) 反序列化。
计算公式
根元素 → [XmlRoot] 类 · 属性 → [XmlAttribute] · 子元素 → [XmlElement] · 重复的子元素 → List<T> · 与属性并存的文本 → [XmlText]
只含文本的元素会变成简单类型的属性:按范围为 int 或 long、decimal、bool(true/false)、DateTime(xs:dateTime 或 xs:date,后者带 DataType = "date")或 string;只要出现过空值就保持为 string。带属性或子元素的元素会变成类,结构相同则共用。值类型的可选元素变为 T?,而值类型的可选属性则会得到一个 …Specified 标志,因为 XmlSerializer 不支持可空的属性。
示例
示例 catalog 会生成三个类。Catalog 含有 List<Book> Books([XmlElement("book")])。Book 含有 Id(string)、Available(bool,因为只有第一本书有它,所以带有 AvailableSpecified)、Author、Title、Price、Published(DateTime,DataType = "date")和 List<string> Tags。Price 含有 currency 属性,以及保存 44.95 或 5.95 的 decimal 类型 [XmlText] Value。
常见问题
为什么属性会有一个 …Specified 搭档?
XmlSerializer 无法把属性映射到可空类型。Specified 模式是它内置的替代方案:这个 bool 告诉你该属性是否存在,并控制是否写出它。
为什么某个值是 string 而不是 int?
因为至少有一个示例值不是纯数字、是空的,或以 0 开头(如邮编或 007),而数字类型会丢掉这个 0。请取消勾选类型推断以全部保持为字符串,或手动修改类型。
它能读取 XSD 文件吗?
不能——它根据示例文档推断类。如果你有 XSD,Microsoft 的 xsd.exe 或 dotnet-xscgen 可以直接根据 Schema 生成类。
我的 XML 会被上传吗?
不会,生成在你的浏览器中完成。
资料来源
最后更新:
包含这些输入的页面地址: https://kakao.mobile/zh/tools/xml-to-c-pojo-generator/
引用此工具
kakaoCalc. (2026, November 8). XML 转 C# 类(XmlSerializer). https://kakao.mobile/zh/tools/xml-to-c-pojo-generator/
“XML 转 C# 类(XmlSerializer).” kakaoCalc, 8 Nov. 2026, kakao.mobile/zh/tools/xml-to-c-pojo-generator/.