正在根据属性值加载 XML
Loading XML based on attribute value
第一次发帖,很久了reader。
我有一个 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
任何指点将不胜感激。
您可以做一些映射并依靠反射:
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()
方法,只需将新的 attribute/property 对添加到映射中即可。
第一次发帖,很久了reader。 我有一个 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
任何指点将不胜感激。
您可以做一些映射并依靠反射:
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()
方法,只需将新的 attribute/property 对添加到映射中即可。