【问题标题】:How do I deserialize this XML我如何反序列化这个 XML
【发布时间】:2018-04-16 11:21:12
【问题描述】:

如何正确反序列化我的示例中的 XML(看最后的问题)?我这样做对吗?或许有办法让它变得更简单、更高效?

XML:

<Warehouse>
        <GUID>0d63057d-99e8-11e6-813b-0003ff000011</GUID>
        <Name>WarehouseName</Name>
        <Terms>
            <Term TargetGUID="490ecabf-f011-11e3-b7d9-6c626dc1e098">2</Term>
            <Term TargetGUID="f332d7ff-efd2-11e3-b7d9-6c626dc1e098">4</Term>
        </Terms>
</Warehouse>

C#: Warehouse.cs:

[Serializable]
public class Warehouse
{

    [XmlArray("Terms", IsNullable=true)]
    [XmlArrayItem("Term")]
    public WarehouseTransferTerm[] TransferTerms { get; set; }

    [XmlElement(ElementName="Name")]
    public string InternalName { get; set; }

    [XmlElement(ElementName="Guid")]
    public Guid Guid { get; set; }

}

WarehouseTransferTerm.cs:

[Serializable]
public class WarehouseTransferTerm
{

    public Guid SourceWarehouseGuid { get; set; }

    [XmlAttribute(AttributeName = "TargetGUID")]
    public Guid TargetWarehouseGuid { get; set; }

    [XmlElement(ElementName="Term")]
    public int TransferTermInDays { get; set; }
}

问题:如何将 Warehouse 的 GUID 属性值设置为 SourceWarehouseGuid?

【问题讨论】:

  • 序列化/反序列化有四个基本类 1) XML 序列化 2) XmlDocument 3) XDocument 4) XmlReader/XmlWriter。最好的选择取决于 XML 的大小、需要提取的数据量、要读取/写入的类的数量以及 xml 的结构。您没有给出足够的要求来确定“最佳”方法。
  • @john SourceWarehouseGuid 必须是仓库的 GUID 属性值mykmyk.pet/2H5W4w8
  • @jdweng 好的,如何将 Warehouse 的 GUID 属性值设置为 SourceWarehouseGuid?
  • 我想您在反序列化 TransferTermInDays 属性时会遇到问题,因为它是父元素的值,而不是内部 XML 元素“Term”的值...
  • 我更新了代码。

标签: c# asp.net xml


【解决方案1】:

您可以实现自定义反序列化逻辑,只需在依赖项上设置值。见这里:https://docs.microsoft.com/en-us/dotnet/api/system.runtime.serialization.ondeserializedattribute?view=netframework-4.7.2

[OnDeserialized()]
internal void OnDeserializedMethod(StreamingContext context)
{
     foreach(var term in TransferTerms)
     {
           term.TargetWarehouseGuid = this.Guid;
     }
}

【讨论】:

  • 这就是我需要的
【解决方案2】:

我喜欢将字典与 Xml Linq 一起使用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;


namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            Dictionary<string, XElement> warehouses = doc.Descendants("Warehouse")
                .GroupBy(x => (string)x.Element("GUID"), y => y)
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());

            XElement warehouse = warehouses["0d63057d-99e8-11e6-813b-0003ff000011"];

            Dictionary<string, XElement> terms = warehouse.Descendants("Term")
                .GroupBy(x => (string)x.Attribute("TargetGUID"), y => y)
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());

            string value = terms["490ecabf-f011-11e3-b7d9-6c626dc1e098"].Value;

            warehouse.SetValue(value);

        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多