读取XML并根据属性执行操作
本文关键字:属性 执行 操作 XML 读取 | 更新日期: 2023-09-27 18:19:03
假设我有一个这样的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>
如何读取该文件并根据元素执行代码片段?例如,如果"name"元素表示"level7a",则执行代码段x。如果"name"元素表示" level7B ",则执行代码段y。
我可以提供这样的代码片段,如果它使回答问题更容易。谢谢你的帮助!
您可以创建一个将属性名称映射到操作的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"]]();
你需要检查键是否确实存在,但你可以为它创建一个扩展方法来封装这个功能:
public static void Execute<TKey>(this IDictionary<TKey, Action> actionMap, TKey key)
{
Action action;
if (actionMap.TryGet(key, out action))
{
action();
}
}
那么你可以这样调用它:
attributActions.Execute(node.Attributes["name"]);
代替Action
(这是一个返回void
的无参数片段),您可能希望使用Action<T>
或Func<T, R>
,以防您需要传递参数和/或获得返回值。
看来你需要两件东西:
-
按特定顺序浏览文件(元素),我猜深度优先
-
根据字符串值执行操作
这应该给你一个大致的概念:
var doc = System.Xml.Linq.XDocument.Load(fileName);
Visit(doc.Root);
private static void Visit(XElement element)
{
string name = element.Attribute("name").Value;
Execute(name);
// you seem to have just 1 child, this will handle multiple
// adjust to select only elements with a specific name
foreach (var child in element.Elements())
Visit(child);
}
private static void Execute(string name)
{
switch (name)
{
case "level1A" :
// snippet a
break;
// more cases
}
}
这个想法要归功于@ChrisWue。这是一种不同的方法,它调用显式定义的方法,而不是匿名的方法:
private Dictionary<String, Action> actionList = new Dictionary<string, Action>();
private void method1() { }
private void method2() { }
private void buildActionList() {
actionList.Add("level7a", new Action(method1));
actionList.Add("level7B", new Action(method2));
// .. etc
}
public void processDoc() {
buildActionList();
foreach (XElement e in (XDocument.Parse(File.ReadAllText(@"C:'somefile.xml")).Elements())) {
string name = e.Attribute("name").Value;
if (name != null && actionList.ContainsKey(name)) {
actionList[name].Invoke();
}
}
}
. .显然我们会在method1 method2等的主体中添加一些东西