如何使用linq复制节点?

时间:2012-09-27 13:34:01

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

我正在尝试使用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)

然而,在设置表。@ Name到“Bar”之后,表格变为 Nothing 。如果我注释掉那一行,输出将有两个节点,都叫做Bar。我怀疑我不是以“正确的方式”执行此操作,无论是更改属性还是将其添加到XDocument(或两者)

2 个答案:

答案 0 :(得分:1)

c#version(将尝试翻译)

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)

答案 1 :(得分:0)

吉姆的回答让我指出了正确的方向。这是我提出的代码

    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)