0

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

4

2 回答 2

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)
于 2012-09-27T13:52:15.333 回答
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)
于 2012-09-27T16:19:02.930 回答