读取XML并根据属性执行操作

MXV*_*MXV 5 .net c# xml

假设我有一个XML文件,例如:

<root>
  <level1 name="level1A">
    <level2 name="level2A">
      <level3 name="level3A">
        <level4 name="level4A">
          <level5 name="level5A">
            <level6 name="level6A">
              <level7 name="level7A">
                <level8 name="level8A"></level8>
              </level7>
            </level6>
          </level5>
        </level4>
      </level3>
    </level2>
  </level1>
   <level1 name="level1B">
     <level2 name="level2B">
       <level3 name="level3B">
        <level4 name="level4B">
          <level5 name="level5B">
            <level6 name="level6B">
              <level7 name="level7B">
                <level8 name="level8B"></level8>
              </level7>
            </level6>
          </level5>
        </level4>
      </level3>
    </level2>
  </level1>
</root>
Run Code Online (Sandbox Code Playgroud)

如何根据元素读取此文件并执行代码片段?例如,如果"name"元素显示"level7a",则执行代码片段X.如果name元素表示level7B,则执行代码片段Y.

如果能让答案更容易,我可以提供这样的代码片段.谢谢您的帮助!

Chr*_*Wue 5

您可以创建一个Dictionary<string, Action>将属性名称映射到操作的名称.然后在解析xml时,您可以在字典中查找片段并执行它.

快速举例:

var attributeActions = new Dictionary<string, Action>();
attributeActions["level1A"] = () => { /* do something */ };
attributeActions["level2A"] = () => { /* do something else */ };

...
// call it
attributActions[node.Attributes["name"]]();
Run Code Online (Sandbox Code Playgroud)

您需要检查密钥是否确实存在,但您可以使用扩展方法来封装该功能:

public static void Execute<TKey>(this IDictionary<TKey, Action> actionMap, TKey key)
{
    Action action;
    if (actionMap.TryGet(key, out action))
    {
         action();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样调用它:

attributActions.Execute(node.Attributes["name"]);
Run Code Online (Sandbox Code Playgroud)

您可能希望使用或者在需要传递参数和/或获取返回值的情况下,而不是Action(无参数片段返回void).Action<T>Func<T, R>