私は以前にこのようなことをしました。LINQ to XML を使用しています。ノード名のキューと、リストの最後のノードの値を受け取る XElement の拡張メソッドを作成しました。私が作成した拡張メソッドは次のとおりです。
/// <summary>
/// Creates nessecary parent nodes using the provided Queue, and assigns the value to the last child node.
/// </summary>
/// <param name="ele">XElement to take action on</param>
/// <param name="nodes">Queue of node names</param>
/// <param name="value">Value for last child node</param>
public static void UpdateOrCreate(this XElement ele, Queue<string> nodes, string value)
{
string previousNodeName = "";
int fullQueueCOunt = nodes.Count;
for (int i = 0; i < fullQueueCOunt; i++)
{
string node = nodes.Dequeue();
if (ele.Descendants(node).FirstOrDefault() == null)
{
if (!string.IsNullOrEmpty(previousNodeName))
{
ele.Element(previousNodeName).Add(new XElement(node));
}
else
{
// use main parent node if this is the first iteration
ele.Add(new XElement(node));
}
}
previousNodeName = node;
}
// assign the value of the last child element
ele.Descendants(previousNodeName).First().Value = value;
}
そして、ここにサンプル実装があります:
XElement element = XElement.Parse(
"<employee>" +
"<name>John Smith</name>" +
"</employee>");
Queue<string> nodeQueue = new Queue<string>();
nodeQueue.Enqueue("address");
nodeQueue.Enqueue("city");
element.UpdateOrCreate(nodeQueue, "myValue");
これにより、入力 XML が取得されます。
<employee>
<name>John Smith</name>
</employee>
それを次のように変更します。
<employee>
<name>John Smith</name>
<address>
<city>myValue</city>
</address>
</employee>
これは、'address' ノードや 'city' ノードが既に存在する場合にも機能します。