C# 如何将对象属性序列化为xml节点的属性而非子元素

来源:这里教程网 时间:2026-02-21 17:29:01 作者:

在 C# 中使用 XmlSerializer 进行序列化时,默认会将对象的属性作为 XML 的子元素输出。如果你希望将某个属性序列化为 XML 节点的属性(attribute) 而不是子元素(element),需要使用 [XmlAttribute] 特性。

使用 [XmlAttribute] 将属性序列化为 XML 属性

给目标属性加上 [XmlAttribute] 特性,即可让 XmlSerializer 将其输出为 XML 节点的属性。

示例代码:

假设有如下类:

using System;
using System.Xml.Serialization;
[XmlRoot("Person")]
public class Person
{
    [XmlAttribute("id")]
    public int Id { get; set; }
    [XmlAttribute("name")]
    public string Name { get; set; }
    // 这个会作为子元素
    public string Email { get; set; }
}

序列化代码:

var person = new Person
{
    Id = 123,
    Name = "Alice",
    Email = "alice@example.com"
};
var serializer = new XmlSerializer(typeof(Person));
using var writer = new StringWriter();
serializer.Serialize(writer, person);
Console.WriteLine(writer.ToString());

输出的 XML 结果为:

```xml ail>alice@example.com ```

可以看到,IdName 成为了 节点的属性,而 Email 是子元素。

注意事项

[XmlAttribute] 只能用于某些简单类型,如:
- 基元类型(int、string、bool、double 等)
- 枚举
- Nullable 类型
不能用于复杂对象或集合,否则会抛出异常。

例如,以下写法是错误的

```csharp [XmlAttribute] public Address HomeAddress { get; set; } // ❌ 复杂类型不能作为 XML 属性 ```

控制属性名称和命名空间

你可以自定义属性名或指定命名空间:

[XmlAttribute("customName")] —— 指定属性名为 customName [XmlAttribute(Namespace = "http://example.com")] —— 指定命名空间

例如:

```csharp [XmlAttribute("uid", Namespace = "http://schemas.example.com/user")] public int UserId { get; set; } ```

总结

要将对象属性序列化为 XML 节点的属性,只需:

使用 [XmlAttribute] 特性标记属性 确保属性类型是支持的简单类型 可选地指定属性名或命名空间

基本上就这些,不复杂但容易忽略。

相关推荐