2010-05-18 47 views
2

我在試圖反序列化是從一個數據集我的XML字符串的問題..有問題,從XML字符串數組反序列化

這裏是XML佈局..

<DataSet> 
    <User> 
    <UserName>Test</UserName> 
    <Email>[email protected]</Email> 
    <Details> 
     <ID>1</ID> 
     <Name>TestDetails</Name> 
     <Value>1</Value> 
    </Details> 
    <Details> 
     <ID>2</ID> 
     <Name>Testing</Name> 
     <Value>3</Value> 
    </Details> 
    </User> 
</DataSet> 

現在我能夠做

public class User 
{ 
    public string UserName {get;set;} 
    public string Email {get;set;} 
    public Details[] Details {get;set;} 
} 
public class Details 
{ 
    public int ID {get;set;} 
    public string Name {get;set;} 
    public string Value {get;set;} 
} 

這反序列化很好,當我剛剛得到的用戶節點,詳細信息心不是零,但它沒有項目反序列化「用戶名」和「電子郵件」 ..

我知道我應該有所有的細節之間,但我寧願不修改的XML,無論如何得到這個反序列化正確無需重新創建XML後,我得到它?

+0

嘗試添加 [XmlArrayItem(NestingLevel = 1,類型= typeof運算(詳細信息))] 以上屬性,但導致細節爲空 – jaekie 2010-05-18 17:47:41

+1

您的XML與您粘貼的完全相同嗎?如果是這樣,它的格式不正確...錯過了結尾>詳細信息 – jvenema 2010-05-18 17:51:55

+0

如上所述,使用Xml序列化時,應該使用System.Xml.Serialization命名空間中的屬性標記類。 – 2010-05-18 17:52:01

回答

3

我假設你正在嘗試使用XmlSerializer的?如果是這樣,您只需將[XmlElement]屬性添加到Details成員。這看起來可能並不直觀,但是這會告訴序列化程序您想要將數組項目序列化或反序列化爲元素,而不是使用項目作爲數組的子元素的數組。

下面是一個簡單的例子

public Test() 
{ 
    string xml = @"<DataSet> 
        <User> 
        <UserName>Test</UserName> 
         <Email>[email protected]</Email> 
         <Details> 
         <ID>1</ID> 
         <Name>TestDetails</Name> 
         <Value>1</Value> 
         </Details> 
         <Details> 
         <ID>2</ID> 
         <Name>Testing</Name> 
         <Value>3</Value> 
         </Details> 
        </User> 
        </DataSet>"; 

    XmlSerializer xs = new XmlSerializer(typeof(DataSet)); 
    DataSet ds = (DataSet)xs.Deserialize(new StringReader(xml)); 
} 

[Serializable] 
public class DataSet 
{ 
    public User User;  
} 

[Serializable] 
public class User 
{ 
    public string UserName { get; set; } 
    public string Email { get; set; } 

    [XmlElement] 
    public Details[] Details { get; set; } 
} 

[Serializable] 
public class Details 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Value { get; set; } 
} 
+0

Serializable屬性不需要用於XML序列化 – 2010-05-18 18:35:15

+0

是的..正是..謝謝,工作就像我需要它,多麼痛苦大聲笑,知道它必須是一個標籤,但沒有看到我需要使用哪一個 – jaekie 2010-05-18 18:36:18

0

使用LINQ XML ..這樣的事情

XElement xe = XDocument.Load("PATH_HERE").Root; 
var v = from k in xe.Descendants() 
        select new { 
         id = k.Element("id"), 
         data = k.Element("data") 
        }; 
1

使用XmlElement屬性上Details屬性:

public class User 
{ 
    public string UserName {get;set;} 
    public string Email {get;set;} 
    [XmlElement] 
    public Details[] Details {get;set;} 
} 

如果沒有,XmlSerializer假定您<Details>元素包裝在一個父做<Details>元素

0

下面是一個示例程序,它不改變XML,但反序列化正確的詳細信息節點:

using System; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 
using System.Xml.Serialization; 
using System.IO; 
using System.Diagnostics; 
using System.Collections.Generic; 

namespace ConsoleApplication1 
{ 
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", 
     IsNullable = false)] 
    public class DataSet 
    { 
     public User User { get; set; } 
    } 

    public class User 
    { 
     public string UserName { get; set; } 
     public string Email { get; set; } 

     [System.Xml.Serialization.XmlElementAttribute("Details")] 
     public Details[] Details { get; set; } 
    } 

    public class Details 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
     public string Value { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      string xmlFragment = 
       @"<DataSet> 
        <User> 
        <UserName>Test</UserName> 
        <Email>[email protected]</Email> 
        <Details> 
         <ID>1</ID> 
         <Name>TestDetails</Name> 
         <Value>1</Value> 
        </Details> 
        <Details> 
         <ID>2</ID> 
         <Name>Testing</Name> 
         <Value>3</Value> 
        </Details> 
        </User> 
       </DataSet>"; 

      StringReader reader = new StringReader(xmlFragment); 
      XmlSerializer xs = new XmlSerializer(typeof(DataSet)); 
      DataSet ds = xs.Deserialize(reader) as DataSet; 

      User user = ds.User; 
      Console.WriteLine("User name: {0}", user.UserName); 
      Console.WriteLine("Email: {0}", user.Email); 

      foreach (Details detail in user.Details) 
      { 
       Console.WriteLine("Detail [ID]: {0}", detail.ID); 
       Console.WriteLine("Detail [Name]: {0}", detail.Name); 
       Console.WriteLine("Detail [Value]: {0}", detail.Value); 
      } 

      // pause program execution to review results... 
      Console.WriteLine("Press enter to exit"); 
      Console.ReadLine(); 
     } 
    } 
} 
0

你需要做的是這樣的:

using System.IO; 
using System.Xml.Serialization; 

namespace TestSerialization 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string content= @"<DataSet> 
    <User> 
     <UserName>Test</UserName> 
     <Email>[email protected]</Email> 
     <Details> 
      <Detail> 
       <ID>1</ID> 
       <Name>TestDetails</Name> 
       <Value>1</Value> 
      </Detail> 
      <Detail> 
       <ID>2</ID> 
       <Name>Testing</Name> 
       <Value>3</Value> 
      </Detail> 
     </Details> 
    </User> 
</DataSet>"; 

      XmlSerializer serializaer = new XmlSerializer(typeof(DataSet)); 

      DataSet o = (DataSet) serializaer.Deserialize(new StringReader(content)); 
     } 
    } 

    public class User 
    { 
     public string UserName { get; set; } 
     public string Email { get; set; } 
     public Detail[] Details { get; set; } 
    } 

    public class Detail 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
     public string Value { get; set; } 
    } 

    public class DataSet 
    { 
     public User User; 
    } 
}