使用Linq to XML在节点之前插入XComment

时间:2015-03-16 08:57:05

标签: c# xml linq xpath

我需要在每个节点的正上方插入xml注释XComment。它与此问题Using XPath to access comments a flat hierachy相同。 Linq中//comment()[following-sibling::*[1][self::attribute]]的等价是什么?

对我来说,一个用例就是这样:

<root>
 <node id="1">
  <element>test</element>
 </node>
 <!-- comment here: TODO: check if ok -->
 <node id="2">
  <element>is this ok?</element>
 </node>
</root>

对不起,似乎有一种误解。我有一个xml文件,需要在使用Linq和lambda表达式选择节点后添加XComment。这意味着我加载了一个xml,在root下选择一个节点并添加XComment。

3 个答案:

答案 0 :(得分:1)

var doc = new XDocument(
            new XElement("root",
                new XElement("node",
                    new XComment("comment here: TODO: check if ok"),
                    new XElement("element", "is this ok?")
                    )
                )
            );

答案 1 :(得分:1)

我猜您正在阅读现有文件并希望在那里添加评论,因此这应该对您有用:

var xdoc = XDocument.Load("//path/to/file.xml");
var nodes = xdoc.XPathSelectElements("//node");
foreach (var n in nodes)
{
    n.AddBeforeSelf(new XComment("This is your comment"));
}

如果由于某种原因必须使用LINQ而不是XPath,请使用:

var nodes = xdoc.Descendants().Where(n=>n.Name=="node");
foreach (var n in nodes)
{
    n.AddBeforeSelf(new XComment("This is your comment"));
}

答案 2 :(得分:1)

试试这个: -

XDocument xdoc = XDocument.Load(@"YourXMl.xml");
xdoc.Descendants("node").FirstOrDefault(x => (string)x.Attribute("id") == "2")
                        .AddBeforeSelf(new XComment("comment here: TODO: check if ok"));
xdoc.Save(@"YourXML.xml");

这里,在filter子句中,您需要传递您希望添加注释的条件。请注意,因为我使用了FirstOrDefault,如果不匹配,您可能会得到空引用异常,因此您必须在添加注释之前检查空值。