当嵌套对象具有命名空间时如何反序列化 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 字符串复制到剪贴板
- 在 VS 菜单中 EDIT/Special Paste/Paste XML as Classes
您问题中的 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;
}
}
给出以下 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 字符串复制到剪贴板
- 在 VS 菜单中 EDIT/Special Paste/Paste XML as Classes
您问题中的 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;
}
}