无法将简单的XML解析为对象吗?
<MeterWalkOrder>
<Name>Red Route</Name>
<Meters>
<Meter>
<MeterID>1</MeterID>
<SerialNumber>12345</SerialNumber>
</Meter>
<Meter>
<MeterID>2</MeterID>
<SerialNumber>SE</SerialNumber>
</Meter>
</Meters>
</MeterWalkOrder>
使用任何串行
var xml = File.ReadAllText("WalkOrder.xml");
var xmlSerializer = new NFormats.Xml.XmlSerializer();
var obj = xmlSerializer.Deserialize<MeterWalkOrder>(new StringReader(xml));
我不能简单的XML到对象
我刚刚回来有没有属性设定2米对象和名字甚至没有设置步行顺序。
public partial class MeterWalkOrder
{
public MeterWalkOrder()
{
Meters = new List<Meter>();
}
[DataMember]
public String Name { get; set; }
}
}
using System;
using System.Xml.Serialization;
namespace WindowsFormsApplication1.Classes
{
public class Meter : IMeter
{
[XmlAttribute]
public int MeterID { get; set; }
[XmlAttribute]
public String SerialNumber { get; set; }
}
}
我愿意尝试任何xml序列化程序。
首先,我建议您阅读Introducing XML Serialization on MSDN 您犯了一些错误,导致您在运行代码时未引发异常。
- 在您的Xml MeterID和SerialNumber中不是它们是元素的属性。 (由于Wyat厄普评论) ,如果你想序列,你必须告诉它应该是
- [Serializable接口]
- 序列化需要实现的公共空构造
- 不开流时,你不关闭它们(使用“使用”)
- 要测试您的序列化的效果最好先连载,然后检查输出,然后执行反序列化
下面为一个完整工作示例:
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace X123
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
MeterWalkOrder mo = new MeterWalkOrder();
mo.Name = "name";
mo.Meters.Add(new Meter { MeterID = 1, SerialNumber = "kdkdkd" });
mo.Meters.Add(new Meter { MeterID = 2, SerialNumber = "holladrio" });
var xmlSerializer = new XmlSerializer(typeof(MeterWalkOrder), new Type[] { typeof(Meter) });
{
xmlSerializer.Serialize(File.CreateText("hello.xml"), mo);
using (Stream s = File.OpenRead("hello.xml"))
{
var obj = xmlSerializer.Deserialize(s);
}
}
}
}
[Serializable]
public class MeterWalkOrder
{
public MeterWalkOrder()
{
}
public string Name { get; set; }
public List<Meter> Meters { get { return meters; } set { meters = value; } }
private List<Meter> meters = new List<Meter>();
}
[Serializable]
public class Meter
{
public Meter()
{
}
[XmlAttribute]
public int MeterID { get; set; }
[XmlAttribute]
public string SerialNumber { get; set; }
}
感谢它的耻辱我不能打勾2! – Paul 2014-10-08 14:07:02
我用示例XML并与Paste Special -> Paste XML as Classes
内部产生的VisualStudio类,改性他们一点点,使他们更具可读性,并得到从它下面的类定义:使用上述类
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public class MeterWalkOrder
{
public string Name { get; set; }
[System.Xml.Serialization.XmlArrayItemAttribute("Meter", IsNullable = false)]
public List<MeterWalkOrderMeter> Meters { get; set; }
}
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public class MeterWalkOrderMeter
{
public int MeterID { get; set; }
public string SerialNumber { get; set; }
}
和下面的代码,它生成的对象没有错误。
string inputXml = File.ReadAllText(@"C:\Temp\SOTest.xml");
//using System.Xml.Serialization;
System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(MeterWalkOrder));
MeterWalkOrder outputObject = xmlSerializer.Deserialize(new StringReader(inputXml)) as MeterWalkOrder;
非常感谢!我选择了另一个答复,因为你的答案完全适合我的确切问题,但另一个答复可以帮助其他人做出同样的错误! – Paul 2014-10-08 14:08:20
这一切都很好,我也错过了属性的一部分,但这就是为什么我们都在这里帮助:) – 2014-10-08 14:17:29
'MeterID'和'SerialNumber'不是'Meter'对象上的属性;他们是元素。尝试用'[XmlElement]'替换'[XmlAttribute]'标签。 – 2014-10-08 12:58:13