gpt4 book ai didi

c# - 如何使用动态元素名称反序列化 XML?

转载 作者:太空宇宙 更新时间:2023-11-03 19:52:26 25 4
gpt4 key购买 nike

我的 XML 如下所示:

<rates>
<rate1>1250.00</rate1>
<rate2>1900.00</rate2>
</rates>

这是在我的可序列化类中:

[XmlRoot("main")]
public class Main
{
[XmlArray("rates"), XmlAnyElement]
public Rates Rates { get; set; }
}

public class Rates : List<Rate> { }

public class Rate
{
[XmlAnyElement]
public string Rate;
}

如何反序列化 XML 以便我可以使用以下方式访问它:

var rate1 = Main.Rates[0].Rate;
var rate2 = Main.Rates[1].Rate;

最佳答案

您可以通过Rates 集合来做到这一点 implement IXmlSerializable :

public class Rates : List<Rate>, IXmlSerializable
{
public Rates() : base() { }
public Rates(IEnumerable<Rate> collection) : base(collection) { }

#region IXmlSerializable Members

XmlSchema IXmlSerializable.GetSchema()
{
return null;
}

void IXmlSerializable.ReadXml(XmlReader reader)
{
// for the `decodeName` delegate, you could check that the node name matches the pattern "rateN" for some integer N, if you want.
XmlKeyValueListHelper.ReadXml(reader, this, null, s => new Rate { RateValue = s });
}

void IXmlSerializable.WriteXml(XmlWriter writer)
{
XmlKeyValueListHelper.WriteXml(writer, this, (i, rate) => "rate" + XmlConvert.ToString(i), r => r.RateValue);
}

#endregion
}

public class Rate
{
public string RateValue;
}

public static class XmlKeyValueListHelper
{
const string XsiNamespace = @"http://www.w3.org/2001/XMLSchema-instance";
const string XsiNil = "nil";

public static void WriteXml<T>(XmlWriter writer, IEnumerable<T> collection, Func<int, T, string> encodeName, Func<T, string> encodeValue)
{
int i = 0;
foreach (var item in collection)
{
writer.WriteStartElement(XmlConvert.EncodeLocalName(encodeName(i, item)));
if (item == null)
{
writer.WriteAttributeString(XsiNil, XsiNamespace, XmlConvert.ToString(true));
}
else
{
writer.WriteValue(encodeValue(item) ?? "");
}
writer.WriteEndElement();
i++;
}
}

public static void ReadXml<T>(XmlReader reader, ICollection<T> collection, Func<int, string, bool> decodeName, Func<string, T> decodeValue)
{
if (reader.IsEmptyElement)
{
reader.Read();
return;
}

int i = 0;
reader.ReadStartElement(); // Advance to the first sub element of the list element.
while (reader.NodeType == XmlNodeType.Element)
{
var key = XmlConvert.DecodeName(reader.Name);
if (decodeName == null || decodeName(i, key))
{
var nilValue = reader[XsiNil, XsiNamespace];
if (!string.IsNullOrEmpty(nilValue) && XmlConvert.ToBoolean(nilValue))
{
collection.Add(default(T));
reader.Skip();
}
else
{
string value;
if (reader.IsEmptyElement)
{
value = string.Empty;
// Move past the end of item element
reader.Read();
}
else
{
// Read content and move past the end of item element
value = reader.ReadElementContentAsString();
}
collection.Add(decodeValue(value));
}
}
else
{
reader.Skip();
}
i++;
}
// Move past the end of the list element
reader.ReadEndElement();
}
}

示例 fiddle .

关于c# - 如何使用动态元素名称反序列化 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37255149/

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