【问题标题】:Loading XML based on attribute value根据属性值加载 XML
【发布时间】:2016-10-02 18:41:20
【问题描述】:

第一次海报,长期阅读。 我有一个 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

任何指针将不胜感激。

【问题讨论】:

  • 您是否尝试过使用 Xml 序列化? stackoverflow.com/questions/16831317/…
  • 我喜欢你的代码。它易于理解和修改。您正在创建数据透视表,数据透视表代码可能很复杂。我会让代码尽可能简单,不要寻找任何捷径。
  • @Sam.C:我不确定序列化是否是正确的方法,因为从技术上讲(据我了解)我必须创建一个字段类来反序列化into,只是为了得到一个键/值对。
  • @jdweng:很高兴你喜欢它,但我有点担心与我在其他地方看到的一些伏都教相比,性能会很糟糕,但不明白。 :)
  • 如果 xml 很小,我不会担心性能。性能只是大型 xml 的问题,然后您应该使用 XmlReader。

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


【解决方案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() 方法,只需将新的属性/属性对添加到映射中即可。

【讨论】:

  • 我喜欢这里的可扩展性,很好的答案。使用 XPaths 之类的东西可以实现相同的(字典驱动的)方法吗?我问的原因是我在同一个项目中有另一个类,它利用了根目录下的各种元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多