属性の追加について

タグの編集
投稿者 LLCOOLJ  (社会人) 投稿日時 2020/8/20 23:13:27
xml文書にvisual basicで書き込みをしようとしています。
下記のように属性を持つノード"Site"を属性"Location="d"を持たせて
新たに追加しようとしています。 
どのように書き込むとうまくいきますでしょうか?
知識のある方ご回答よろしくお願いします。


<DataPath>
<Site Locatin="a">C:\temp</Site>
<Site Locatin="b">C:\temp</Site>
<Site Locatin="c">C:\temp</Site>
</DataPath>
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/8/21 14:35:43
とりあえずこんな感じ。

ノード末尾の改行が必須かどうか、とか、encoding 指定が必要かどうかなどで、
いろいろ書き方が変わってきます。LoadOptions や SaveOptions は適宜調整を。

Dim doc = XDocument.Load("D:\TEMP\Sample.xml", LoadOptions.PreserveWhitespace)
Dim newSite = <Site Location="d">C:\temp</Site>
doc.Root.Add(newSite)
doc.Root.Add(vbCrLf)
doc.Save("D:\TEMP\Sample2.xml")
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/8/21 15:21:43
> とりあえずこんな感じ。

実行結果はこうなります。
指定通り、Locatin ではなく Location として追加されていることが分かりますね。




なお先のコードだと、BOM 付の UTF-8 エンコードで出力されます。
もしも BOM 無しで出力したいなど、別の Encoding で出力したいのであれば
Encoding を明示した XmlTextWriter に Save するようにしてみてください。

Using writer As New XmlTextWriter("D:\TEMP\Sample3.xml"New UTF8Encoding(False))
    doc.Save(writer)
End Using
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/8/21 21:23:28
> 下記のように属性を持つノード"Site"を属性"Location="d"を持たせて
> 新たに追加しようとしています。 

もしかして、既存の Site ノードに Location="d" な属性を付与するという話でしょうか?
だとしたらこう書けます。

Dim doc = XDocument.Load("D:\TEMP\Sample.xml")

For Each site In doc.<DataPath>.<Site>
    site.SetAttributeValue("Location""d")
Next

'MsgBox(doc.ToString()) 
doc.Save("D:\TEMP\Sample2.xml")