gpt4 book ai didi

c# 使用 IXmlSerializable 反序列化

转载 作者:数据小太阳 更新时间:2023-10-29 02:29:22 38 4
gpt4 key购买 nike

我有这样的 xml:

    <data>    
<audit_values>
<audit_value>
<channel>2</channel>
<week>
<mo_th>6,501698000000</mo_th>
<fr>8,414278000000</fr>
<sa>9,292674000000</sa>
<sun>8,551982000000</sun>
<holid>7,164605000000</holid>
</week>
</audit_value>
<audit_value>
<channel>1</channel>
<week>
<mo_th>6,501698000000</mo_th>
<fr>8,414278000000</fr>
<sa>9,292674000000</sa>
<sun>8,551982000000</sun>
<holid>7,164605000000</holid>
</week>
</audit_value>
</audit_values>
</data>

我需要将它反序列化为类。 但问题是,那一周以后会改变(它将包含更多元素,我不知道它们的名称)

数据:

[XmlRoot("data")]
public class Data
{
[XmlArray("audit_values")]
[XmlArrayItem("audit_value", IsNullable = true)]
public AuditValue[] AuditValues { get; set; }
}

审计值:

[XmlRoot("audit_value")]
public class AuditValue
{
[XmlElement("week", typeof(TVR))]
public Week Week;
}

周:

    [XmlRoot("week")]
public class Week : IXmlSerializable
{
public Dictionary<string, double> Values = new Dictionary<string, double>();

public XmlSchema GetSchema()
{
return null;
}

public void ReadXml(XmlReader reader)
{
reader.Read();
var sub = reader.ReadSubtree();
do
{
if (sub.NodeType == XmlNodeType.Element)
{
string name = sub.Name;
string val = sub.ReadElementContentAsString();
Values.Add(name, Convert.ToDouble(val));
}
} while (sub.Read());
}

public void WriteXml(XmlWriter writer)
{

}
}

但是在反序列化之后,我只有一个元素,其中只有一个元素记录在字典值中。我做错了什么?

GitHub: https://github.com/olegletynain/XmlTest/tree/master/XmlTestRead

最佳答案

我根据@Matthew Whited 在评论部分的想法调整了您的 ReadXml 方法,以下方法完成了这项工作:

public void ReadXml(XmlReader reader)
{
Values = XElement.Parse(reader.ReadOuterXml())
.Elements()
.ToDictionary(k => k.Name.ToString(), v => double.Parse(v.Value));
}

作为旁注,您只需要在实际根元素上使用 XmlRoot,而不是在每个类上,因此我将其从 AuditValue 和 Week 中删除。我也不知道TVR是什么。它没有用“typeof(TVR)”编译,所以我也删除了它。

为了完整起见,这是我的类版本:

[XmlRoot("data")]
public class Data
{
[XmlArray("audit_values")]
[XmlArrayItem("audit_value", IsNullable = true)]
public AuditValue[] AuditValues { get; set; }
}

public class AuditValue
{
[XmlElement("week")]
public Week Week;
}

public class Week : IXmlSerializable
{
public Dictionary<string, double> Values = new Dictionary<string, double>();

public XmlSchema GetSchema()
{
return null;
}

public void ReadXml(XmlReader reader)
{
Values = XElement.Parse(reader.ReadOuterXml())
.Elements()
.ToDictionary(k => k.Name.ToString(), v => double.Parse(v.Value));
}

public void WriteXml(XmlWriter writer)
{

}
}

关于c# 使用 IXmlSerializable 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33154270/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com