1

Linq to XML のかなり新しいxml ノードを削除して ( relationship を再帰的に使用) 、ドキュメントを保存するにはどうすればよいですか。

xml の構造は、サービスに由来するため変更できません。以下は、タスク サービスの xml です。すべてのタスクには、1 つ以上のネストされたタスクが存在する可能性のあるネストされたタスクを含めることができます。ネスティングは最大であることが意図されていますN level

  • linq to xml を使用して親タスクの 1 つが削除された場合、そのすべての子を削除するにはどうすればよいですか?

  • 正常に削除されたすべてのノードを確認するにはどうすればよいですか?

XML:

<Tasks>
  <Task ID="1">Clean the Room</Task>
  <Task ID="2">Clean the Closet</Task>
  <Task ID="3" ParentId="2">Remove the toys</Task>
  <Task ID="4" ParentId="3">Stack action Figures on Rack</Task>
  <Task ID="5" ParentId="3">Put soft toys under bed</Task>
</Tasks>

上記の xml でtaskId=2が削除された場合、それはサブタスク、つまりId = 3削除する必要があります。は削除されているため3、サブタスク4であり5、同様に削除する必要があります。

4

2 に答える 2

4

私はxmlでそれを仮定するつもりです:

<Tasks> 
  <Task ID="1">Clean the Room</Task>
  <Task ID="2">Clean the Closet</Task>
  <Task ID="3" ParentId="2">Remove the toys</Task>
  <Task ID="4" ParentId="3">Stack action Figures on Rack</Task>
  <Task ID="5" ParentId="3">Put soft toys under bed</Task>

  <Task note="test node" />
  <Task ID="a" note="test node" />
</Tasks>

Task ID=2が削除された場合の解決策は次のとおりです。

// tasks = XDocument.root;

public static void RemoveTasksAndSubTasks(XElement tasks, int id)
{
  List<string> removeIDs = new List<string>();
  removeIDs.Add(id.ToString());

  while (removeIDs.Count() > 0)
  {
    // Find matching Elements to Remove
    // Check for Attribute, 
    // so we don't get Null Refereence Exception checking Value

    var matches = 
        tasks.Elements("Task")
             .Where(x => x.Attribute("ID") != null
                         && removeIDs.Contains(x.Attribute("ID").Value));

    matches.Remove();

    // Find all elements with ParentID 
    // that matches the ID of the ones removed.
    removeIDs = 
        tasks.Elements("Task")
             .Where(x => x.Attribute("ParentId") != null
                         && x.Attribute("ID") != null
                         && removeIDs.Contains(x.Attribute("ParentId").Value))
             .Select(x => x.Attribute("ID").Value)
             .ToList();

  }
}

結果:

<Tasks> 
  <Task ID="1">Clean the Room</Task>

  <Task note="test node" />
  <Task ID="a" note="test node" />
</Tasks>
于 2012-04-30T05:37:45.567 に答える
1

次の回答を使用

XDocument doc = XDocument.Load("task.xml");
var q = from node in doc.Descendants("Task")
        let attr = node.Attribute("ID")
        let parent = node.Attribute("ParentId")
        where ((attr != null && attr.Value == "3") || (parent != null && parent.Value == "3"))
        select node;
q.ToList().ForEach(x => x.Remove());
doc.Save("output.xml"); 
于 2012-04-30T04:38:11.183 に答える