[英]Load Multiple XML Elements into Object using Serialization in C#
我正在尝试使用C#中的反序列化将多个具有相同名称的元素从XML加载到类中。 我的示例中的所有内容都可以正常加载,但不会填充数组元素(Element3)。
码:
class Program
{
static void Main(string[] args)
{
FileStream file = new FileStream("service.xml", FileMode.Open);
if (file != null)
{
XmlSerializer serializer = new XmlSerializer(typeof(Service));
Service service = (Service)serializer.Deserialize(file);
}
}
}
public class Service
{
public bool Element1;
public string Element2;
public string[] Element3;
}
XML:
<Service>
<Element1>true</Element1>
<Element2>Text 1</Element2>
<Element3>Text 2</Element3>
<Element3>Text 3</Element3>
</Service>
尝试在Element3
上放置[XmlElement]
。
您的阵列未加载的原因是,就.NET XML序列化而言,您不是在尝试读取数组。 数组将表示如下:
<Element3Array>
<ArrayElement>Text 2</ArrayElement>
<ArrayElement>Text 3</ArrayElement>
</Element3Array>
您需要更改源XML的格式或为您的类创建自定义XML Serializer以处理您的情况。
我认为你的xml是错的。 从逻辑上讲,数组是这样序列化的:
<Element3>
<string>Text 2</string>
<string>Text 3</string>
</Element3>
因此,您的xml必须具有以下格式:
<Service>
<Element1>true</Element1>
<Element2>Text 1</Element2>
<Element3>
<string>Text 2</string>
<string>Text 3</string>
</Element3>
</Service>
编辑 :如果无法更改格式,请添加一个示例以反序列化此xml。 以下代码未经过测试。
您的类Service必须从IXmlSerializable派生:
public class Service : IXmlSerializable
{
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public void ReadXml(System.Xml.XmlReader reader)
{
List<string> element3 = new List<string>();
while (reader.Read())
{
if (reader.Name == "Element1" && reader.NodeType == XmlNodeType.Element)
{
Element1 = Convert.ToBoolean(reader.ReadString());
}
else if (reader.Name == "Element2" && reader.NodeType == XmlNodeType.Element)
{
Element2 = reader.ReadString();
}
if (reader.Name == "Element1" && reader.NodeType == XmlNodeType.Element)
{
element3.Add(reader.ReadString());
}
}
Element3 = element3.ToArray();
}
public void WriteXml(System.Xml.XmlWriter writer)
{
writer.WriteStartElement ("Service");
writer.WriteStartElement ("Element1");
writer.WriteString(Element1.ToString());
writer.WriteEndElement();
writer.WriteStartElement ("Element2");
writer.WriteString(Element2.ToString());
writer.WriteEndElement();
foreach (string ele in Element3)
{
writer.WriteStartElement ("Element3");
writer.WriteString(ele);
writer.WriteEndElement();
}
writer.WriteEndElement();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.