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

XmlSerializer未序列化类属性问题及命名空间移除方法

问题解决:XML序列化属性缺失与命名空间移除

我来帮你搞定这两个问题,咱们逐个分析解决:

1. 公共属性未纳入XML输出的原因与修复

你当前的XML里看不到Book类的公共属性,核心问题出在节点导入的方式上:
你调用了doc.ImportNode(b.SerializeToXmlElement(), false),这里第二个参数false表示浅导入——只会导入<Edition>节点本身,不会把它的子节点(也就是你定义的Series、Title、ISBN这些属性对应的XML元素)一起导入到目标文档里。

修复方法

把ImportNode的第二个参数改成true,执行深导入:

XmlNode edition = doc.ImportNode(b.SerializeToXmlElement(), true);

这样就能把Book实例序列化后的所有子节点都完整导入到你的根文档中了。

2. 移除Edition节点上的xmlns:xsi和xmlns:xsd属性

默认情况下,XmlSerializer会自动添加这两个标准命名空间。要去掉它们,我们需要在序列化时显式指定XmlSerializerNamespaces,并添加一个空的命名空间映射,告诉序列化器不要生成默认的命名空间。

修复方法

修改Book类中的SerializeToXmlElement方法:

public XmlElement SerializeToXmlElement()
{
    XmlDocument doc = new XmlDocument();
    // 配置命名空间,添加空命名空间以移除默认的xsi/xsd
    XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
    namespaces.Add("", ""); // 空前缀 + 空命名空间

    using (XmlWriter writer = doc.CreateNavigator().AppendChild())
    {
        new XmlSerializer(this.GetType()).Serialize(writer, this, namespaces);
    }
    return doc.DocumentElement;
}

修改后的完整代码与输出

修改后的Book类Serialize方法(已包含命名空间处理)

[XmlType("Edition")]
public class Book 
{
    #region Attributes
    private string series;
    private string title;
    private string isbn;
    private string pubDate;
    #endregion Attributes

    #region Encapsulated fields
    [XmlElement]
    public string Series { get => series; set => series = value; }
    [XmlElement]
    public string Title { get => title; set => title = value; }
    [XmlElement("ISBN")]
    public string Isbn { get => isbn; set => isbn = value; }
    [XmlElement("Publication_Date")]
    public string EditionPubDate { get => pubDate; set => pubDate = value; }
    #endregion Encapsulated fields

    #region Constructors
    public Book() { }
    #endregion Constructors

    #region Methods
    public XmlElement SerializeToXmlElement()
    {
        XmlDocument doc = new XmlDocument();
        XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
        namespaces.Add("", ""); // 移除默认命名空间

        using (XmlWriter writer = doc.CreateNavigator().AppendChild())
        {
            new XmlSerializer(this.GetType()).Serialize(writer, this, namespaces);
        }
        return doc.DocumentElement;
    }
    #endregion Methods
}

修改后的输入代码(已改为深导入)

XmlDocument doc = new XmlDocument();
doc.AppendChild(doc.CreateXmlDeclaration("1.0","utf-8",null));
XmlNode rootnode = doc.AppendChild(doc.CreateElement("Root_Node"));
XmlNode editionsNode = rootnode.AppendChild(doc.CreateElement("Editions"));

Book b = new Book();
b.Isbn = "978-0-553-10953-5";
b.Title = "A Brief History of Time";
// 改为深导入
XmlNode edition = doc.ImportNode(b.SerializeToXmlElement(), true);
editionsNode.AppendChild(edition);
edition.AppendChild(doc.CreateElement("Impressions"));

最终输出XML

<Root_Node>
    <Editions>
        <Edition>
            <Title>A Brief History of Time</Title>
            <ISBN>978-0-553-10953-5</ISBN>
            <Series />
            <Publication_Date />
            <Impressions />
        </Edition>
    </Editions>
</Root_Node>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:19:45