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になります。その行をコメントアウトすると、出力には2つのノードがあり、どちらも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 に答える