2016-08-15 2 views
-1

나는이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 문서는 XML 데이터를 읽을했습니다 :

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 
:이 배열리스트 구조를 갖고 싶어

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

class MyAssembly{ 

    [XmlAttribute("name")] 
    string name; 

    [XmlAttribute("folder")] 
    string folder; 

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

하지만 내 속성으로이 배열 목록을 가져올 수 없습니다. 나는 그것을 충분히 설명하기를 희망한다.

관련 raiserle

+0

죄송합니다. C#,이 질문이 업데이트되었습니다. – raiserle

+0

시도한 것을 보여주는 일부 코드는 도움이되지 않을 것입니다. – jdoyle1983

+0

''Xml-Attributes''를 사용하여 이것을 시도했습니다. – raiserle

답변

1

것으로 보인다대로 다음과 같은 문제가, XmlSerializer를 사용하는 가정 :

  1. XmlSerializerpublic 형식과 멤버를 직렬화. 모든 유형 및 회원은 비공개입니다.

  2. public MyAssembly[] myassembly 구성원의 MyAssembly[XmlElement("myassembly")]으로 표시되어야합니다. 이것은 배열이 <myassembly>이라는 요소 시퀀스로 serialize되어 외부 컨테이너 요소 인없이 직렬화되어야 함을 나타냅니다. 기본적으로 외부 컨테이너 요소는 컬렉션을 serialize 할 때 사용됩니다.

따라서 수업은 (속성 공공 필드를 변환)해야합니다

다음
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.