🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

808閲覧

C# ReplaceWithメソッドが機能しない

uppi

総合スコア6

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/01/07 07:29

前提・実現したいこと

現在、C#を勉強中なのですが、XMLをC#で操作するプログラムを作成中に詰まってしまったので、質問させてください。

作成中のプログラムは、既にあるXMLファイルを読み込み、ある要素をReplaceWithメソッドで置換するというプログラムです。
デバッグに問題や例外等はないのですが、実行結果が自分の思っていた結果と違ったので、どこが間違っているのかも分からない状態です。何か勘違いしているのかもしれません。

期待していた結果は、読み込んだnovelists.xmlの4つ目の<novelist>タグ("宮沢 賢治")をC#側で作成したタグ("宮澤 賢治"の方)に置き換えることでしたが、当初の"宮沢 賢治"のままでした。

該当のソースコード

C#

1var xdoc = XDocument.Load(@"C:\Users\lifeg\Desktop\novelists.xml"); 2 3 var element = xdoc.Root.Elements() 4 .Single(x => x.Element("name").Value == "宮沢 賢治"); 5 string elmstring = 6 @"<novelist> 7 <name kana=""みやざわ けんじ"">宮澤 賢治</name> 8 <birth>1896-08-27</birth> 9 <death>1933-09-21</death> 10 <masterpieces> 11 <title>銀河鉄道の夜</title> 12 <title>注文の多い料理店</title> 13 </masterpieces> 14 </novelist>"; 15 var newElement = XElement.Parse(elmstring); 16 element.ReplaceWith(newElement); 17 18 Console.WriteLine(element.Element("name").Value); 19 20novelists.xmlの中身 21<?xml version="1.0" encoding="UTF-8"?> 22<novelists> 23 <novelist> 24 <name kana="なつめ そうせき">夏目 漱石</name> 25 <birth>1867-02-09</birth> 26 <death>1916-12-09</death> 27 <masterpieces> 28 <title>吾輩は猫である</title> 29 <title>坊ちゃん</title> 30 <title>こころ</title> 31 </masterpieces> 32 </novelist> 33 <novelist> 34 <name kana="かわばた やすなり">川端 康成</name> 35 <birth>1899-06-14</birth> 36 <death>1972-04-16</death> 37 <masterpieces> 38 <title>雪国</title> 39 <title>伊豆の踊子</title> 40 </masterpieces> 41 </novelist> 42 <novelist> 43 <name kana="だざい おさむ">太宰 治</name> 44 <birth>1909-06-19</birth> 45 <death>1948-06-13</death> 46 <masterpieces> 47 <title>斜陽</title> 48 <title>人間失格</title> 49 </masterpieces> 50 </novelist> 51 <novelist> 52 <name kana="みやざわ けんじ">宮沢 賢治</name> 53 <birth>1896-08-27</birth> 54 <death>1933-09-21</death> 55 <masterpieces> 56 <title>銀河鉄道の夜</title> 57 <title>風の又三郎</title> 58 </masterpieces> 59 </novelist> 60</novelists> 61

補足情報(FW/ツールのバージョンなど)

Visual Studioのバージョン
Microsoft Visual Studio Community 2019
Version 16.4.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

xdocの方をConsole.WriteLineしてみると、変わっているので、
おそらくelement.ReplaceWith(newElement)は、親から自分(element)を切り離して、変わりにnewElementを差し込んでいるだけなのではないかと思います。
(ノードの差し替えだけが起こるのであって、elementの中身が変わるわけではない)

投稿2020/01/07 07:41

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uppi

2020/01/07 07:54

さっそくの回答ありがとうございました。 takabosoftさんのおっしゃる通りでした。コンソールに表示する部分を下記のようにコードを変更したところ、上手くいきました。 ありがとうございました。 Console.WriteLine(element.Element("name").Value); ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ foreach (var item in xdoc.Root.Elements()) { Console.WriteLine(item.Element("name").Value); }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問