c# - 将具有多个元素的 XML 反序列化为单个 C# 对象

标签 c# xml serialization

我需要反序列化一个如下所示的 XML 文档:

<Root>
  <Items>
    <Item>
      <ItemHeader Attr1="A" Attr2="B" Attr3="C" />
      <ItemDetails Attr4="D" Attr5="E" />
    </Item>
    ...
  </Items>
</Root>

进入一个看起来像这样的类:

[Serializable, XmlRoot("Item")]
Public class MyItem
{
  [XmlAttribute("Attr1")]
  public string Attr1 { get; set; }
  [XmlAttribute("Attr5")]
  public string Attr5 { get; set; }
}

我正在使用以下代码执行反序列化:

XDocument doc;
XElement rootElem = doc.Element("Root");

foreach (XElement xe in rootElem.Descendants("Item"))
{
  MyItem item = new MyItem();
  XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyItem));
  XmlReader xRdr = xe.CreateReader();
  item = (MyItem)xmlSerializer.Deserialize(xRdr);
}

但是,没有任何元素被复制到对象实例中。

这可行吗?我需要反序列化每个子元素吗?

谢谢

最佳答案

我不确定是否有一种方法可以通过属性使用默认的 XML 序列化程序来做到这一点,而不用做整个类结构来匹配您的 XML - 所以 ItemHeaderItemDetails 需要自己的类(class)。

虽然您可以实现 IXmlSerializable 接口(interface),因此您可以完全自定义 - 如果您必须保持 MyItem 的结构不变。

static void Main(string[] args)
{
    XmlSerializer myItemSerializer = new XmlSerializer(typeof(MyItem));

    var xmlDoc = XDocument.Parse(@"<Item>
                                <ItemHeader Attr1=""A"" Attr2=""B"" Attr3=""C"" />
                                <ItemDetails Attr4=""D"" Attr5=""E"" />
                            </Item>");

    using (var reader = xmlDoc.CreateReader())
    {
        MyItem myItem = (MyItem)myItemSerializer.Deserialize(reader);
    }


    Console.Read();
}

[Serializable, XmlRoot("Item")]
public class MyItem : IXmlSerializable
{
    [XmlAttribute("Attr1")]
    public string Attr1 { get; set; }
    [XmlAttribute("Attr5")]
    public string Attr5 { get; set; }

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {
        reader.ReadStartElement("Item");

        do
        {
            switch (reader.Name)
            {
                case "ItemHeader":
                    Attr1 = reader.GetAttribute("Attr1");
                    reader.Read();
                    break;
                case "ItemDetails":
                    Attr5 = reader.GetAttribute("Attr5");
                    reader.Read();
                    break;
                default:
                    throw new XmlException(String.Format("{0} was not expected", reader.Name));
            }
        } while (reader.Name != "Item");


        reader.ReadEndElement();
    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        writer.WriteStartElement("ItemHeader");
        writer.WriteAttributeString("Attr1", Attr1);
        writer.WriteEndElement();
        writer.WriteStartElement("ItemDetails");
        writer.WriteAttributeString("Attr5", Attr5);
        writer.WriteEndElement();
    }
}

关于c# - 将具有多个元素的 XML 反序列化为单个 C# 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26804864/

相关文章:

c# - 使用 C# 检测二维空间中的光投影和交叉点

C# - 在没有引用的情况下使用依赖注入(inject)时将 dll 复制到 exe 输出目录?

c# - 需要 [Key] 属性的非实体类

Android 不会显示布局

c# - Umbraco通过代码创建内容导致缓存失效

Java BufferedReader 不读取文件内容

Android开发-布局xml文件的eclipse ide中的 'missing theme error'

jquery - 如何在提交表单时使用 jQuery 和 jQuery Mobile 在序列化字符串中给出重复项?

java - 在 Java 中使用序列化实现克隆方法是一种好习惯吗?

c# - 在 C# 中的二进制序列化中排除父对象