C# 反序列化XML为集合属性返回null
我正在尝试反序列化以下XML:C# 反序列化XML为集合属性返回null,c#,xml,deserialization,xmlserializer,C#,Xml,Deserialization,Xmlserializer,我正在尝试反序列化以下XML: <?xml version="1.0" encoding="utf-8" ?> <mf:somedata xmlns:mf="urn:somedata"> <CurrentAccount> <AccountType>test</AccountType> <Charge> <ChargeType>test</Ch
<?xml version="1.0" encoding="utf-8" ?>
<mf:somedata xmlns:mf="urn:somedata">
<CurrentAccount>
<AccountType>test</AccountType>
<Charge>
<ChargeType>test</ChargeType>
</Charge>
</CurrentAccount>
<CurrentAccount>
<AccountType>test 2</AccountType>
<Charge>
<ChargeType>test 2</ChargeType>
</Charge>
</CurrentAccount>
</mf:somedata>
测试
测试
测试2
测试2
使用以下类:
[XmlRoot("somedata", Namespace = "urn:somedata")]
public class MfCurrentAccounts
{
[XmlElement("CurrentAccount")]
public CurrentAccount[] CurrentAccounts { get; set; }
}
public class CurrentAccount
{
public string AccountType { get; set; }
[XmlElement("Charge")]
public Charge[] Charges { get; set; }
}
public class Charge
{
public string ChargeType { get; set; }
}
var c = new XmlSerializer(typeof(MfCurrentAccounts)).Deserialize(new StringReader(xml)) as MfCurrentAccounts;
c.CurrentAccounts // <-- is always null
[XmlRoot(“somedata”,Namespace=“urn:somedata”)]
公共类活期账户
{
[XmlElement(“当前账户”)]
公共当前帐户[]当前帐户{get;set;}
}
公共类活期账户
{
公共字符串AccountType{get;set;}
[XmlElement(“费用”)]
公共收费[]收费{get;set;}
}
公共课收费
{
公共字符串ChargeType{get;set;}
}
var c=新的XmlSerializer(typeof(MfCurrentAccounts))。将(新的StringReader(xml))反序列化为MfCurrentAccounts;
c、 CurrentAccounts/也许您应该尝试将MfCurrentAccounts类替换为:
[XmlRoot("somedata", Namespace = "urn:somedata")]
public class MfCurrentAccounts : List<CurrentAccount>
{
public MfCurrentAccounts():base()
{}
}
[XmlRoot(“somedata”,Namespace=“urn:somedata”)]
公共类MfCurrentAccounts:列表
{
公共MfCurrentAccounts():base()
{}
}
或者看看
希望这会有所帮助问题在于名称空间
当我在测试环境中创建整个类设置时,我得到了一个非常不同的输出。以下是我认为您应该尝试阅读的内容:
<?xml version="1.0"?>
<mf:somedata xmlns:mf="urn:somedata">
<mf:CurrentAccount>
<mf:AccountType>something 1</mf:AccountType>
<mf:Charge>
<mf:ChargeType>Charge Type 1</mf:ChargeType>
</mf:Charge>
</mf:CurrentAccount>
<mf:CurrentAccount>
<mf:AccountType>something 2</mf:AccountType>
<mf:Charge>
<mf:ChargeType>Charge Type 2</mf:ChargeType>
</mf:Charge>
</mf:CurrentAccount>
</mf:somedata>
当在中重新阅读时:
ms.Position = 0;
b = ser.Deserialize(ms) as MfCurrentAccounts;
在运行了这两部分之后,b现在是a的完美克隆,我上面展示的xml就是生成的xml。对不起,用反序列化代码更新了这个问题。你不需要用[Serializable()]
标记类吗?@François我已经尝试过了,但显然它不是必需的。可能是@Dan-o的重复当这个代码已经按照答案所示做了时,它怎么可能是重复的呢?使用此代码的注释/属性与“重复答案”的唯一区别在于它使用数组而不是列表。谢谢。不幸的是,XML来自第三方,因此我无法控制它。我尝试将此添加到CurrentAccounts属性:[XmlElement(“CurrentAccount”,Namespace=“urn:somedata”)]
,但无效。在尝试反序列化xml之前,是否可以编辑xml?如果您在第一行使用一些正则表达式并从顶部节点删除“mf:”,那么您将拥有一个统一的classdef,它应该正确地反序列化…@Tom您是否尝试过[xmlement(“CurrentAccount”,Namespace=String.Empty)]?@jbl您是个救命恩人!谢谢!:)@jbl你救了另一个生命,成功了!!只返回一个空列表(不过,我还是会玩玩它,因为它似乎应该会起作用。我会看看如何写入磁盘和使用XSD文件,但我不想走这条路。@Tom这个类可能需要一个公共构造函数。我更新了我的答案,但你对上一个答案的评论也行得通。:)
ms.Position = 0;
b = ser.Deserialize(ms) as MfCurrentAccounts;