问题
I am using silverlight5 and c# to achieve my targets. I have xml file below:
string xmlstring =
<?xml version="1.0" encoding="utf-8" ?>
<parameter>
<name>bands_amounts</name>
<label>Bands Amounts</label>
<unit></unit>
<component>
<type>List</type>
<attributes>
<type>Integer</type>
<displayed>4</displayed>
<add_remove>yes</add_remove>
<item>1 000 000</item>
<item>5 000 000</item>
<item>10 000 000</item>
<item>20 000 000</item>
</attributes>
<attributes>
<ccypair>XAUUSD</ccypair>
<item>100</item>
<item>500</item>
<item>1000</item>
</attributes>
</component >
</parameter>
On deserializing i got 3 classes.
parameter.cs :
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Runtime.Serialization.Json;
using System.Runtime;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.IO;
using System.Collections.Generic;
using System.Diagnostics;
namespace Model.XML
{
[XmlRoot("parameter")]
public class parameter
{
public string name { get; set; }
public string label { get; set; }
[XmlElement("component")]
public component component { get; set; }
}
}
and
attribute.cs:
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Runtime.Serialization.Json;
using System.Runtime;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.IO;
using System.Collections.Generic;
using System.Diagnostics;
using System.Xml;
namespace Model.XML
{
public class attributes
{
public string type { get; set; }
public string displayed { get; set; }
public string add_remove { get; set; }
public string ccypair { get; set; }
public List<int> item { get; set; }
public static void Main()
{
string xmlstring = @"<?xml version='1.0' encoding='utf-8' ?> <parameter> <name>bands_amounts</name> <label>Bands Amounts</label> <unit>54</unit> <component> <type>List</type> <attributes> <type>Integer</type> <displayed>4</displayed> <add_remove>yes</add_remove> <item>1 000 000</item> <item>5 000 000</item> <item>10 000 000</item> <item>20 000 000</item> </attributes> <attributes> <ccypair>XAUUSD</ccypair> <item>100</item> <item>500</item> <item>1000</item> </attributes> </component > </parameter>";
XmlSerializer serializer = new XmlSerializer(typeof(parameter));
XmlReader reader = XmlReader.Create(new StringReader(xmlstring));
var Object1 = (parameter)serializer.Deserialize(reader);
foreach (var attrib in Object1.component.attribut)
{
Debug.WriteLine(attrib.type);
Debug.WriteLine(attrib.item);
}
}
}
}
and the third :
component.cs
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Runtime.Serialization.Json;
using System.Runtime;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.IO;
using System.Collections.Generic;
using System.Diagnostics;
using System.Xml;
namespace Model.XML
{
public class component
{
[XmlElement("attributes")]
public List<attributes> attribut { get; set; }
/* public static void Main()
{
string xmlstring = @"<?xml version='1.0' encoding='utf-8' ?> <parameter> <name>bands_amounts</name> <label>Bands Amounts</label> <unit>54</unit> <component> <type>List</type> <attributes> <type>Integer</type> <displayed>4</displayed> <add_remove>yes</add_remove> <item>1 000 000</item> <item>5 000 000</item> <item>10 000 000</item> <item>20 000 000</item> </attributes> <attributes> <ccypair>XAUUSD</ccypair> <item>100</item> <item>500</item> <item>1000</item> </attributes> </component > </parameter>";
XmlSerializer deserializer = new XmlSerializer(typeof(parameter));
XmlReader reader = XmlReader.Create(new StringReader(xmlstring));
var Object1 = (parameter)deserializer.Deserialize(reader);
foreach (var attrib in Object1.component.attribut)
{
Debug.WriteLine(attrib.item);
// Debug.WriteLine(Object1.name);
}
} */
}
}
My problem is i am not able to see "1 000 000" and "5 000 000" and "10 000 000" on debugging when i tried to do Debug.WriteLine(attrib.item);
in attributes class also "ccypair" shows null on doing Debug.WriteLine(attrib.ccypair); (may be because the structure of this xml contains two <attributes>..</attributes> <attributes>..</attributes>
). how to get them ? Because my next step is to display a GUI using them so i will need their values. Could some one please as i am a beginer.
Do I need to do something like :
[XmlArray("component"), XmlArrayItem("attributes", typeof(attributes))]
public List<attributes> component
{
get { return (_attributes); }
set { _attributes = value; }
}
private List<attributes> _attributes = new List<attributes>();
because this "item" which contains "1 000 000" ,"5 000 000" etc. are inside the "attribute" ? Please explain me i am beginner
回答1:
using below code you can serialize and deserialize you object even you can stored your xml
SerializeObject(objDividendList, filename);
objDividendList = DeSerializeObject>(filename);
public void SerializeObject<T>(T serializableObject, string fileName)
{
if (serializableObject == null) { return; }
try
{
XmlDocument xmlDocument = new XmlDocument();
XmlSerializer serializer = new XmlSerializer(serializableObject.GetType());
using (MemoryStream stream = new MemoryStream())
{
serializer.Serialize(stream, serializableObject);
stream.Position = 0;
xmlDocument.Load(stream);
xmlDocument.Save(fileName);
stream.Close();
}
}
catch (Exception ex)
{
//Log exception here
log.Error("SerializeObject ", ex);
}
}
public T DeSerializeObject<T>(string fileName)
{
if (string.IsNullOrEmpty(fileName)) { return default(T); }
T objectOut = default(T);
try
{
string attributeXml = string.Empty;
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(fileName);
string xmlString = xmlDocument.OuterXml;
using (StringReader read = new StringReader(xmlString))
{
Type outType = typeof(T);
XmlSerializer serializer = new XmlSerializer(outType);
using (XmlReader reader = new XmlTextReader(read))
{
objectOut = (T)serializer.Deserialize(reader);
reader.Close();
}
read.Close();
}
}
catch (Exception ex)
{
//Log exception here
log.Error("DeSerializeObject ", ex);
}
return objectOut;
}
来源:https://stackoverflow.com/questions/23429534/how-to-deserialize-the-xmlelement-containing-list-in-xml