【问题标题】:How can I copy a node using linq?如何使用 linq 复制节点?
【发布时间】:2012-09-27 13:34:01
【问题描述】:

我正在尝试使用 linq 查找名称等于 Foo 的 MyNode,并复制该节点并将其添加到 XML 但新节点应具有名称 Bar,然后保存文件。

<?xml version="1.0" encoding="utf-8"?>
<MyRoot>
  <MyNode Name="Foo">
    <Data Type="String">ABC</Data>
  </MyNode>
</MyRoot>

这段代码找到了节点

    Dim doc As XDocument = XDocument.Load(xmlFile)
    Dim sheet = From item In doc...<MyRoot>...<MyNode> Select item Where item.@Name = "Foo"

我正在尝试使用它来添加节点并更改名称。

    sheet.@Name = "Bar" 'After excecuting this, sheet becomes "Nothing"
    doc.Root.Add(sheet.First)
    doc.Save(outFile)

但是,将 sheet.@Name 设置为“Bar”后,sheet 变为 Nothing。如果我注释掉该行,输出将有两个节点,都名为 Bar。我怀疑我没有以“正确的方式”这样做,无论是在更改属性还是将其添加到 XDocument(或两者)方面

【问题讨论】:

    标签: .net vb.net linq linq-to-xml


    【解决方案1】:

    c#版本(会尝试翻译)

    var doc = XDocument.Load(path);
                var node = doc.Elements("MyRoot").Elements("MyNode").FirstOrDefault(m => m.Attribute("Name").Value == "Foo");
                var newNode = new XElement(node);
                newNode.SetAttributeValue("Name", "Bar");
                doc.Root.Add(newNode);
    

    应该在vb中

    Dim doc as XDocument = XDocument.Load(xmlFile)
    Dim sheet = From item...<MyNode>.FirstOrDefault(Function(m) m.@Name = "Foo")
    Dim newSheet As New XElement(sheet)
    newSheet.SetAttributeValue("Name", "Bar")
    doc.Root.Add(newSheet)
    

    【讨论】:

      【解决方案2】:

      Jim 的回答让我指出了正确的方向。这是我想出的代码

          Dim doc As XDocument = XDocument.Load(xmlFile)
          Dim sheet = From item In doc...<MyRoot>...<MyNode> Select item Where item.@Name = "Foo"
          Dim copy As XElement = New XElement(sheet.First)
          copy.SetAttributeValue("Name", "Bar")
          doc.Root.Add(copy)
          doc.Save(outFile)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-29
        • 1970-01-01
        • 2015-03-12
        • 2013-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多