【问题标题】:How to deserialize the following xml in C#如何在 C# 中反序列化以下 xml
【发布时间】:2013-04-30 09:11:11
【问题描述】:

我想用XmlSerializer反序列化下面的xml文件

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

【问题讨论】:

  • 煮沸应该可以解决问题。
  • XmlElement 添加到NameArtifact

标签: c# xml-serialization


【解决方案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; }
}

【讨论】:

  • 如果我错了请纠正我,但其他类型中的任何类型都应标记为[Serializable],以便XmlSerializer 工作。
  • @Sinatr 好的,我正在纠正。 Serializable 属性仅由 BinaryFormatter 使用。 XmlSerializer 不使用它。所以没必要。 (顺便说一句,我在验证它有效后发布了这个代码)
【解决方案2】:

这个呢:

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

【讨论】:

  • 不确定这将如何帮助解决问题。您可能需要添加更多细节。
  • 问题是:“我应该如何组织课程?”而不是“我应该如何反序列化?”
【解决方案3】:

我希望我可以帮助您了解本准则。创建一个新项目并使用此代码对其进行调试。不要忘记将您的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:请纠正我的语法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多