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

.NET 4.8中如何序列化包含XML属性的对象并避免嵌套层级?

解决方案:使用[XmlAnyElement]属性实现平级序列化

当然可以实现你想要的序列化效果!在.NET 4.8框架下,只需要给Stuff属性添加[XmlAnyElement]特性,就能让XElement的内容直接作为<RESULT>的子元素输出,而不会被包裹在<Stuff>标签里。

修改后的Result类代码

[XmlRoot(ElementName = "RESULT", Namespace = "", IsNullable = false)]
public class Result
{
    public string Message { get; set; }
    
    // 添加XmlAnyElement特性,告诉序列化器直接输出XElement的内容
    [XmlAnyElement]
    public XElement Stuff { get; set; }

    public override string ToString()
    {
        var ser = new XmlSerializer(GetType());
        using (var stream = new StringWriter())
        {
            ser.Serialize(stream, this);
            return stream.ToString();
        }
    }
}

测试示例

// 解析已有XML为XElement
var fooElement = XElement.Parse(@"
<FOO>
  <BAR>Hello World</BAR>
  <BAR2>Hello World</BAR2>
  <BAR3>Hello World</BAR3>
</FOO>");

// 创建Result实例并赋值
var result = new Result
{
    Message = "Hello World",
    Stuff = fooElement
};

// 序列化输出
Console.WriteLine(result.ToString());

输出结果

运行后你会得到完全符合需求的XML:

<?xml version="1.0" encoding="utf-16"?>
<RESULT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Message>Hello World</Message>
  <FOO>
    <BAR>Hello World</BAR>
    <BAR2>Hello World</BAR2>
    <BAR3>Hello World</BAR3>
  </FOO>
</RESULT>

可选:修改输出的节点名称

如果你想把<FOO>改成<Stuff>,只需要给[XmlAnyElement]指定名称参数即可:

[XmlAnyElement("Stuff")]
public XElement Stuff { get; set; }

这样序列化后就会输出<Stuff>标签替代原来的<FOO>,完全满足你的备注需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 11:59:05