2016-08-15 5 views
-1

Я XML-документ, как этотXML, десериализации

<?xml version="1.0"?> 
<data> 
    <myassembly name="t1" folder="1"> 
     <myassembly name="t1.1" folder="0" /> 
     <myassembly name="t1.2" folder="0"> 
      <myassembly name="t1.2.1" folder="0"/> 
     </myassembly> 
     <myassembly name="t2" folder="0"/> 
     <myassembly name="t3" folder="0"> 
      <myassembly name="t3.1" folder="0"/> 
      <myassembly name="t3.2" folder="0"/> 
     </myassembly> 
    </myassembly> 
</data> 

И два класса для чтения данных XML:

class data{ 
    [XmlElement("myassembly")] 
    MyAssembly myassembly; 
} 

class MyAssembly{ 

    [XmlAttribute("name")] 
    string name; 

    [XmlAttribute("folder")] 
    string folder; 

    [XmlArrayItem("myassembly")] 
    MyAssembly[] myassembly; 
} 

Я хочу, чтобы этот список массив структуры:

data: 
    assembly: 
     -name: t1 
     -folder: 1 
     -myassembly[4]: 
      [0]-name: t1.1 
      [0]-folder: 0 
      [0]-myassembly: null 
      [1]-name: t1.2 
      [1]-folder: 0 
      [1]-myassembly: [4] 
       [0]-name: t1.2.1 
       [0]-folder: 0 
       [0]-myassembly: null 
      [2]-name: t2 
      [2]-folder: 0 
      [2]-myassembly: null 
      [3]-name: t3 
      [3]-folder: 0 
      [3]-myassembly: [2] 
       [0]-name: t3.1 
       [0]-folder: 0 
       [0]-myassembly: null 
       [1]-name: t3.2 
       [1]-folder: 0 
       [1]-myassembly: null 

Но: с моими атрибутами я не могу получить этот список массивов. Надеюсь, я описал это достаточно.

отношении raiserle

+0

извините, C#, я обновил этот вопрос. – raiserle

+0

Некоторый код, который показывает, что вы пробовали, который не работает, может значительно помочь. – jdoyle1983

+0

Я пробовал это с некоторыми '' Xml-Attributes'' – raiserle

ответ

1

Предполагая, что вы используете XmlSerializer, как кажется вероятным, у вас есть следующие вопросы:

  1. XmlSerializer только упорядочивает public типов и членов. Все ваши типы и члены являются частными.

  2. public MyAssembly[] myassembly член MyAssembly должен быть помечен как [XmlElement("myassembly")]. Это указывает на то, что массив должен быть сериализован как последовательность элементов с именем <myassembly>без внешний элемент контейнера. По умолчанию внешний элемент контейнера используется при сериализации коллекции.

Таким образом, ваши классы должны быть (преобразование общественных полей свойств):

public class data 
{ 
    [XmlElement("myassembly")] 
    public MyAssembly myassembly { get; set; } 
} 

public class MyAssembly 
{ 
    [XmlAttribute("name")] 
    public string name { get; set; } 

    [XmlAttribute("folder")] 
    public string folder { get; set; } 

    [XmlElement("myassembly")] 
    public MyAssembly[] myassembly { get; set; } 
} 

Тогда вы можете сериализации и десериализации с помощью этих методов расширения:

public static class XmlSerializationHelper 
{ 
    public static T LoadFromXML<T>(this string xmlString) 
    { 
     using (StringReader reader = new StringReader(xmlString)) 
     { 
      return (T)new XmlSerializer(typeof(T)).Deserialize(reader); 
     } 
    } 

    public static string GetXml<T>(this T obj, bool omitStandardNamespaces = false) 
    { 
     XmlSerializerNamespaces ns = null; 
     if (omitStandardNamespaces) 
     { 
      ns = new XmlSerializerNamespaces(); 
      ns.Add("", ""); // Disable the xmlns:xsi and xmlns:xsd lines. 
     }   
     using (var textWriter = new StringWriter()) 
     { 
      var settings = new XmlWriterSettings() { Indent = true, IndentChars = " " }; // For cosmetic purposes. 
      using (var xmlWriter = XmlWriter.Create(textWriter, settings)) 
       new XmlSerializer(obj.GetType()).Serialize(xmlWriter, obj, ns); 
      return textWriter.ToString(); 
     } 
    } 
} 

Используя их следующим образом:

var data = xmlString.LoadFromXML<data>(); 

Образец fiddle.

Смежные вопросы