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

How to deserialize XML when nested object has a namesapce

给出以下 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 属性,但找不到正确的 Namespace 标签组合。上面的代码反序列化了 webParts,但计数为 0,none 的 webPart 元素被反序列化。应该对 c# 做些什么才能使这项工作正常进行?谢谢!

(在大多数情况下)使用 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;
    }
}