2010-05-18 3 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> 

Теперь я возможность десериализации «UserName» и «Электронная почта» при выполнении

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

Это десериализует хорошо, когда я просто получить пользовательский узел, детали Isnt нулевой, но не имеет элементов в нем ..

Я знаю, что я должен иметь между всеми деталями, но я скорее не изменяю XML, так или иначе, чтобы заставить это десериализоваться должным образом, не воссоздавая XML после его получения?

+0

Пробовал добавлять [XmlArrayItem (NestingLevel = 1, Type = TypeOf (подробности))] выше свойство, но приводит к тому, что информация будет равна нулю. – jaekie

+1

Является ли ваш XML точно так же, как вы вставили? Если это так, это неверно ... отсутствует окончание> после/Подробности – jvenema

+0

Как уже упоминалось выше, вы должны пометить свои классы атрибутами из пространства имен System.Xml.Serialization при использовании сериализации Xml. –

ответ

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 –

+0

Да .. точно .. спасибо, работал так, как будто мне это нужно, что боль lol , знал, что это должен быть тег, который просто не видел, какой мне нужно было использовать – jaekie

0

Использование Linq To 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; 
    } 
} 
Смежные вопросы