根据属性值加载XML

时间:2016-06-02 20:46:57

标签: c# xml xml-parsing linq-to-xml xml-attribute

第一次海报,长时间读者。 我有一个XML导入要写(另一个是第一个),并且我迷失了可以采用的冲突方法和方法。

我尝试导入的XML看起来大致如下:

...
<TableRow>
    <Field Name="DeliveryNote" Type="etc..">Text</Field>
    <Field Name="OrderNumber" Type="etc..">Text</Field>
    and so on...
</TableRow>
...

我有一个对象,其中包含大多数字段的属性(并非所有字段都是),而且我目前正在构造函数中填充属性,这些构造函数抛出相关的XElement来构建,如下所示:

public Order(XElement p_tableRow)
{
foreach (XElement field in p_TableRow.Elements("Field"))
    {
        switch (field.Attribute("Name").Value)
        {
            case "DeliveryNote":
                ReasonCode = field.Value;
                break;
            case "OrderNumber":
                OrderID = field.Value;
                break;
            case "ProductCode":
                CustProductCode = field.Value;
                break;
            case "Quantity":
                QuantityCharged = field.Value;
                break;
...

我的问题是,虽然这可以完成工作,但它看起来非常笨重(而且很难看)。当然有更好的方法吗?

我已尝试通过投影了解如何执行此操作但未找到一个示例,您可以根据节点中的属性决定数据的目标。

我正在使用.NET 3.5

任何指针都会受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

你可以做一些映射并依赖反射:

private Dictionary<string, string> _mapping = new Dictionary<string, string>
{
    { "DeliveryNote", "ReasonCode" },
    { "OrderNumber",  "OrderID" },
    { "ProductCode",  "CustProductCode" },
    { "Quantity",     "QuantityCharged" }
};

然后你的导入看起来像这样:

public Order(XElement p_tableRow)
{
    foreach (XElement field in p_TableRow.Elements("Field"))
    {
        string propName = _mapping[field.Attribute("Name").Value];
        PropertyInfo propInfo = GetType().GetProperty(propName);
        propInfo.SetValue(this, field.Value);
    }
}

然后您永远不必再次更新Order()方法,只需添加新的属性/属性对即可。