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
相关产品推荐
相关产品推荐

