将 XElement 添加到列表并使其 children 成为列表的剩余部分
Add XElement to list and have it's children be remainder of list
如果我有以下xml:
<Employees>
<Person>
<ID>1000</ID>
<Name>Nima</Name>
<LName>Agha</LName>
</Person>
<Person>
<ID>1002</ID>
<Name>Ligha</Name>
<LName>Ligha</LName>
</Person>
<Person>
<ID>1003</ID>
<Name>Jigha</Name>
<LName>Jigha</LName>
</Person>
</Employees>
我想在一个索引节点之后添加一个新节点,并将剩余的人节点添加为这个新节点的children。
因此添加后的新 xml 将如下所示:
<Employees>
<Person>
<ID>1000</ID>
<Name>Nima</Name>
<LName>Agha</LName>
</Person>
<RefNode>
<Person>
<ID>1002</ID>
<Name>Ligha</Name>
<LName>Ligha</LName>
</Person>
<Person>
<ID>1003</ID>
<Name>Jigha</Name>
<LName>Jigha</LName>
</Person>
</RefNode>
</Employees>
到目前为止,我已经尝试使用
ElementAt(index).AddAfterSelf()
但这只是将它添加到下一行,并没有将接下来的两个人添加为 children。
您可以按照以下方式进行。已在代码中添加注释以便更好地理解
var xdoc = XDocument.Parse(xml);
// Unclear how you are identifying the node after which the change has to happen. For sake of example, using ID
var selectedNode = xdoc.Descendants("Person")
.First(x=>Convert.ToInt32(x.Element("ID").Value)==1000);
// Collection of nodes that would be added as child of newly inserted node
var nodeAfterSelectedNode = xdoc.Descendants("Person")
.SkipWhile(x=>x==selectedNode)
.ToList();
// Create the new node with previously identified 'nodeAfterSelectedNode' as Children
var newElement = new XElement("RefNode",nodeAfterSelectedNode);
// Remove the existing Nodes (ones that are being moved to child)
foreach(var node in nodeAfterSelectedNode)
{
node.Remove();
}
// add the new node
selectedNode.AddAfterSelf(newElement);
var newXml = xdoc.ToString();
输出
<Employees>
<Person>
<ID>1000</ID>
<Name>Nima</Name>
<LName>Agha</LName>
</Person>
<RefNode>
<Person>
<ID>1002</ID>
<Name>Ligha</Name>
<LName>Ligha</LName>
</Person>
<Person>
<ID>1003</ID>
<Name>Jigha</Name>
<LName>Jigha</LName>
</Person>
</RefNode>
</Employees>
输出样本
如果我有以下xml:
<Employees>
<Person>
<ID>1000</ID>
<Name>Nima</Name>
<LName>Agha</LName>
</Person>
<Person>
<ID>1002</ID>
<Name>Ligha</Name>
<LName>Ligha</LName>
</Person>
<Person>
<ID>1003</ID>
<Name>Jigha</Name>
<LName>Jigha</LName>
</Person>
</Employees>
我想在一个索引节点之后添加一个新节点,并将剩余的人节点添加为这个新节点的children。
因此添加后的新 xml 将如下所示:
<Employees>
<Person>
<ID>1000</ID>
<Name>Nima</Name>
<LName>Agha</LName>
</Person>
<RefNode>
<Person>
<ID>1002</ID>
<Name>Ligha</Name>
<LName>Ligha</LName>
</Person>
<Person>
<ID>1003</ID>
<Name>Jigha</Name>
<LName>Jigha</LName>
</Person>
</RefNode>
</Employees>
到目前为止,我已经尝试使用
ElementAt(index).AddAfterSelf()
但这只是将它添加到下一行,并没有将接下来的两个人添加为 children。
您可以按照以下方式进行。已在代码中添加注释以便更好地理解
var xdoc = XDocument.Parse(xml);
// Unclear how you are identifying the node after which the change has to happen. For sake of example, using ID
var selectedNode = xdoc.Descendants("Person")
.First(x=>Convert.ToInt32(x.Element("ID").Value)==1000);
// Collection of nodes that would be added as child of newly inserted node
var nodeAfterSelectedNode = xdoc.Descendants("Person")
.SkipWhile(x=>x==selectedNode)
.ToList();
// Create the new node with previously identified 'nodeAfterSelectedNode' as Children
var newElement = new XElement("RefNode",nodeAfterSelectedNode);
// Remove the existing Nodes (ones that are being moved to child)
foreach(var node in nodeAfterSelectedNode)
{
node.Remove();
}
// add the new node
selectedNode.AddAfterSelf(newElement);
var newXml = xdoc.ToString();
输出
<Employees>
<Person>
<ID>1000</ID>
<Name>Nima</Name>
<LName>Agha</LName>
</Person>
<RefNode>
<Person>
<ID>1002</ID>
<Name>Ligha</Name>
<LName>Ligha</LName>
</Person>
<Person>
<ID>1003</ID>
<Name>Jigha</Name>
<LName>Jigha</LName>
</Person>
</RefNode>
</Employees>
输出样本