在某个节点之后添加节点或在C#中的XmlToLinq中添加父节点

时间:2016-09-07 05:49:57

标签: c# xml linq-to-xml

我有这样的结构

<root>
    <parent>
        <item>
            <value>1</value>
        </item>
        <item>
            <value>3</value>
        </item>
    </parent>
</root>

现在我想添加一个值为2的新项目。我想将它添加到正确的位置。我的linq看起来像这样:

xDoc.Root
    .Element("parent")
    .Elements("item")
    .Where(i => i.Element("value").Value < 2)
    .LastOfDefault()
    .AddAfterSelf(new XElement("item", new XElement("value", 2)));

这适用于该结构。

但如果父级中没有元素,则会因NullReferenceException而失败:

<root>
    <parent>
    </parent>
</root>

在这种情况下,我只想将此元素添加到父节点。如何用更少的血来做到这一点?

1 个答案:

答案 0 :(得分:2)

在尝试添加项目之前,您需要先验证是否找到了某个项目。幸运的是,C#6添加了空条件运算符,以表达这一点。

doc.Elements("root").Elements("parent").Elements("item")
    .OrderBy(i => (int)i.Element("value"))
    .LastOrDefault(i => (int)i.Element("value") < 2)
    ?.AddAfterSelf(new XElement("item", new XElement("value", 2)));

如果您使用的是旧版本,请明确检查。

var last = doc.Elements("root").Elements("parent").Elements("item")
    .OrderBy(i => (int)i.Element("value"))
    .LastOrDefault(i => (int)i.Element("value") < 2);
if (last != null)
    last.AddAfterSelf(new XElement("item", new XElement("value", 2)));
相关问题