有问题,从XML字符串数组反序列化

问题描述:

我在试图反序列化是从一个数据集我的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

我假设你正在尝试使用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

使用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") 
        }; 

使用XmlElement属性上Details属性:

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

如果没有,XmlSerializer假定您<Details>元素包装在一个父做<Details>元素

下面是一个示例程序,它不改变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(); 
     } 
    } 
} 

你需要做的是这样的:

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