当嵌套对象具有名称空间时,如何反序列化XML

本文关键字:反序列化 XML 空间 嵌套 对象 有名称 | 更新日期: 2023-09-27 17:54:20

给定以下XML:

<webParts>
  <webPart xmlns="http://schemas.microsoft.com/WebPart/v3">
    <title>Title One</title>
  </webPart>
  <webPart xmlns="http://schemas.microsoft.com/WebPart/v3">
    <title>Title Two</title>
  </webPart>
</webParts>

和下面的c#:

[XmlRoot("webParts")]
public class webParts : List<webPart>
{
    static public webParts FromXml(string path)
    {
        webParts returnValue = null;
        var serializer = new XmlSerializer(typeof(webParts));
        using (var stream = File.OpenRead(path))
        {
            returnValue = (webParts)serializer.Deserialize(stream);
        }
        return returnValue;
    }
}
public class webPart
{
    public string title { get; set; }
}

我正在尝试反序列化XML。我不能控制XML,我可以改变c#。如果我在webPart元素中删除命名空间,可以在反序列化期间这样做,它工作得很好。然而,看起来有点笨拙。我觉得应该在类中添加XML属性,但是找不到名称空间标记的正确组合。上面的代码反序列化了webPart,但是计数为0,没有一个webPart元素被反序列化。应该对c#做些什么来实现这个功能?谢谢!

当嵌套对象具有名称空间时,如何反序列化XML

使用vs从XML构建类(在大多数情况下)是一项非常简单的任务。

  • 复制XML字符串到剪贴板
  • 在VS菜单中编辑/特殊粘贴/粘贴XML为类

问题中的XML将被转换为

结构
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute( "code" )]
[System.Xml.Serialization.XmlTypeAttribute( AnonymousType = true )]
[System.Xml.Serialization.XmlRootAttribute( Namespace = "", IsNullable = false )]
public partial class webParts
{
    private webPart[ ] webPartField;        
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute( "webPart", Namespace = "http://schemas.microsoft.com/WebPart/v3" )]
    public webPart[ ] webPart
    {
        get 
        {
            return this.webPartField;
        }
        set
        {
            this.webPartField = value;
        }
    }
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute( "code" )]
[System.Xml.Serialization.XmlTypeAttribute( AnonymousType = true, Namespace = "http://schemas.microsoft.com/WebPart/v3" )]
[System.Xml.Serialization.XmlRootAttribute( Namespace = "http://schemas.microsoft.com/WebPart/v3", IsNullable = false )]
public partial class webPart
{
    private string titleField;
    /// <remarks/>
    public string title
    {
        get
        {
            return this.titleField;
        }
        set
        {
            this.titleField = value;
        }
    }
}

,可以用来转换你的xml

public partial class webParts
{
    static public webParts FromXml(string path)
    {
        webParts returnValue = null;
        var serializer = new XmlSerializer(typeof(webParts));
        using (var stream = File.OpenRead(path))
        {
            returnValue = (webParts)serializer.Deserialize(stream);
        }
        return returnValue;
    }
}
相关文章: