2014-10-08 87 views
2

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

回答

1

首先,我建議您閱讀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

1

我用示例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