2013-04-30 61 views
-3

以下的XML我想用XmlSerializer为反序列化下面的XML文件如何反序列化在C#

<?xml version="1.0"?> 
<General> 
    <Component> 
    <Foo>Foo value1</Foo> 
    <Bar>Bar value1</Bar> 
    </Component> 
    <Component> 
    <Foo>Foo value2</Foo> 
    <Bar>Bar value2</Bar> 
    </Component> 
    <Component> 
    <Foo>Foo value3</Foo> 
    <Bar>Bar value3</Bar> 
    </Component> 
    <Component> 
    <Foo>Foo value4</Foo> 
    <Bar>Bar value4</Bar> 
    </Component> 
</General> 

我应该如何组织类反序列化?

编辑: 这是我的尝试:

public class General 
{ 
    public List<Component> Component { get; set; } 
} 

public class Component 
{ 
    public string Name { get; set; } 
    public string Artifact { get; set; } 
} 
+2

沸腾它应该做的伎俩。 – 2013-04-30 09:12:28

+0

将'XmlElement'添加到'Name'和'Artifact'中 – Sinatr 2013-04-30 11:27:11

回答

0

这个怎么样:

public class Component 
{ 
    public string Foo {get;set;} 
    public string Bar {get;set;} 
} 
+0

不知道这将如何帮助解决问题。您可能需要添加更多的细节。 – 2013-04-30 09:14:21

+0

问题是:“我应该如何组织班级?”而不是“我应该如何反序列化?” – 2013-04-30 09:15:44

0

我希望我可以帮你这个代码。创建一个新项目并使用此代码进行调试。不要忘了将XML-Data加入debug-folder。在xreader.Name Value中显示,以了解您必须执行的操作。我不知道你的组件的结构,所以我不能帮你更多。如果你告诉它我,我可以帮助更多的

 public Form1() 
     { 
     InitializeComponent(); 
     XmlTextReader xreader = new XmlTextReader("YourXML.xml"); 
     string elem = ""; 
     while (xreader.Read()) //Read per line (and ?Withspace? (Pls correct me here)) 
     { 
      switch (xreader.NodeType) //Is the line a Element(<General>;<Component>;<Foo>;<Bar>) or Text(value1) 
      { 
       case XmlNodeType.Element: 
        if (xreader.Name.ToString().Contains("Foo")) 
         elem = xreader.Name; 
        else if (xreader.Name.ToString().Contains("Bar")) 
         elem = xreader.Name; 
        break; 

       case XmlNodeType.Text: 
        { 
         if (elem == "Foo") 
         { 
          string value1 = xreader.Value; 
         } 
         else if (elem == "Bar") 
         { 
          string value2 = xreader.Value; 
         } 
        } 
        break; 


      } 
     } 
     xreader.Close(); 
    } 

PS:请纠正我的语法

1

General类。我将列表名改为Components,并用XmlElement属性对其进行了修饰。

XmlSerializer ser = new XmlSerializer(typeof(General)); 
var g = (General)ser.Deserialize(yourStream); 

public class General 
{ 
    [XmlElement("Component")]  
    public List<Component> Components { get; set; } 
} 


public class Component 
{ 
    public string Foo { get; set; } 
    public string Bar { get; set; } 
} 
+0

纠正我,如果我错了,但其他类型内的任何类型应标记为'[Serializable]''XmlSerializer'工作。 – Sinatr 2013-04-30 11:26:22

+1

@Sinatr好的我正在纠正。 “Serializable”属性仅由BinaryFormatter使用。 XmlSerializer不使用它。所以不需要它。 (顺便说一句,我验证它的工作后发布此代码) – I4V 2013-04-30 11:52:08