无法将简单的XML解析为对象吗?

问题描述:

XML无法将简单的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序列化程序。

+0

'MeterID'和'SerialNumber'不是'Meter'对象上的属性;他们是元素。尝试用'[XmlElement]'替换'[XmlAttribute]'标签。 – 2014-10-08 12:58:13

首先,我建议您阅读Introducing XML Serialization on MSDN 您犯了一些错误,导致您在运行代码时未引发异常。

  1. 在您的Xml MeterID和SerialNumber中不是它们是元素的属性。 (由于Wyat厄普评论)
  2. ,如果你想序列,你必须告诉它应该是
  3. [Serializable接口]
  4. 序列化需要实现的公共空构造
  5. 不开流时,你不关闭它们(使用“使用”)
  6. 要测试您的序列化的效果最好先连载,然后检查输出,然后执行反序列化

下面为一个完整工作示例:

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; } 
    } 
+0

感谢它的耻辱我不能打勾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; 
+0

非常感谢!我选择了另一个答复,因为你的答案完全适合我的确切问题,但另一个答复可以帮助其他人做出同样的错误! – Paul 2014-10-08 14:08:20

+0

这一切都很好,我也错过了属性的一部分,但这就是为什么我们都在这里帮助:) – 2014-10-08 14:17:29