質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
86.02%
XML

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

C#

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

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

Q&A

解決済

ネストされたapp.configの書き込み方法

okaken1
okaken1

総合スコア1

XML

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

C#

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

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

1回答

0グッド

0クリップ

1236閲覧

投稿2021/04/27 08:47

前提・実現したいこと

ネストされたapp.configのシリアライズ方法が分かりません。
以下のようにappSettingsに出力したいと思っています。

Properties.Settings.Defaultを使わずに、ファイルの直接編集で行おうと思っていますが、方法が分かりません。
詳しい方、ご教示いただけないでしょうか。

■行いたい出力ファイルのイメージ----------

<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="Class" value='[ {"name":"田中", "value":"82"}, {"name":"佐藤", "value":"56"}, {"name":"山本", "value":"93"}, ]'/> </appSettings> </configuration>

開発環境 -------------------------
Visual Studio 2017
.Net Framework 4.7

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

SurferOnWww

2021/04/27 08:58

> Properties.Settings.Defaultを使わずに、ファイルの直接編集で行おうと思っていますが その理由は何でしょう? それによって答えが変わってくるかもしれません。
okaken1

2021/04/27 09:30

迅速なレスポンスありがとうございます。 現在読み込みは直接app.configをConfigration.Managerを介して行っていますが、Properties.Settingsには登録していません。 ユーザーが直接app.configをメモ帳で開いて編集してもらう使い方にしていましたが、ユーザーのリテラシーを考慮すると少し難易度が高くなるので追加で編集画面を作ろうと思った次第です。 Properties.Settingsへの登録をすると整合性が取れなくなるのではないかと思い、除外して考えていましたが、実現できるのであればProperties.Settingsを使う方法でも問題ございません。
SurferOnWww

2021/04/27 10:15

app.config を編集するのではなくて、独自に xml ファイルとか json ファイルに設定情報を保持するようにして、それを編集する「編集画面」を作るのが良さそうな気がします。100% 質問者さんの自由にできますから。
okaken1

2021/04/27 10:21

>SurferOnWww様 それはそうなんですが、一度app.configで配布してしまい、設定済みのユーザーもいるので難しいところです。 もう少し待って他の回答が無いようであればそのようにしたいと思います。 ありがとうございました。
SurferOnWww

2021/04/27 10:30

> 一度app.configで配布してしまい 配布されているのは xxx.exe.config ではないかと思うのですが、ちょっと変ですね。そこはちょっと置いといて・・・ 何にせよ xml ファイルですから、読み込んで、編集して、書き戻すのは「編集画面」を作れば可能だと思います。ただ、xxx.exe.config とか user.config をユーザーが勝手に変更してしまうのは、アプリの設定とバッティングして問題を起こしそうな気がします。
okaken1

2021/04/28 00:45

>SurferOnWww様 ご指摘ありがとうございます。おっしゃる通り、配布しているのはxxx.exe.configです。正確ではありませんでした。 一般的なXMLと記載が異なり、key,valueで扱われるため、XMLのネストについて調べてもイマイチ自分の課題に置き換えて解決方法が見い出せずにいます…。
SurferOnWww

2021/04/28 01:23

value の文字列の形式は JSON の array のようですので、xml ファイルから value の文字列を取得したら JSON から C# のオブジェクトにデシリアライズしてそれを編集し、編集し終わったら JSON にシリアライズして xml ファイルの value に書き戻せばよさそうに思いますが。
SurferOnWww

2021/04/28 02:50

上のコメントの具体例を回答欄に書いておきます。

回答1

1

ベストアンサー

xxx.exe.config とか user.config をユーザーが勝手に変更してしまうのは、アプリの設定とバッティングして問題を起こしそうな気がしますが、とりあえずそれは置いといて・・・

何にせよ xml ファイルですから、読み込んで、編集して、書き戻すのは「編集画面」を作れば可能だと思います。

value の文字列の形式は JSON の array のようですので、xml ファイルから value の文字列を取得したら JSON から C# のオブジェクトにデシリアライズしてそれを編集し、編集し終わったら JSON にシリアライズして xml ファイルに書き戻せばよさそうに思います。

その具体例を以下に書きます。

まず、xml ファイルですが、正しい xml 形式となるように、属性の文字列は " で囲い、その文字列内の " は " にエスケープしてください。質問にあった xml ファイルの内容は以下のようになります。

イメージ説明

それを上に書いたように JSON デシリアライズ/シリアライズして書き直すサンプルコードを以下に示します。XMLFile2.xml は上の画像の xml ファイルです。JSON デシリアライズ/シリアライズには Newtonsoft.Json を使いました。using 句には余計なものが多々入っていますので注意。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Threading; using System.Xml.Linq; using CsvHelper; using CsvHelper.Configuration; using System.Globalization; using System.Security.Cryptography; using System.IO.Compression; using Newtonsoft.Json; namespace ConsoleApp1 { class Program { static void Main(string[] args) { string xmlfile = @"C:\Users...\XMLFile2.xml"; XElement root = XElement.Load(xmlfile); XElement appSettings = root.Element("appSettings"); IEnumerable<XElement> addElems = appSettings.Elements("add"); XElement userSetting = addElems.Where(e => e.Attribute("key").Value == "Class").FirstOrDefault(); string data = userSetting.Attribute("value").Value; List<User> users = JsonConvert.DeserializeObject<List<User>>(data); users[1].Name = "日本"; users[1].Value = "100"; users.Add(new User { Name = "鈴木", Value = "18" }); data = JsonConvert.SerializeObject(users); userSetting.Attribute("value").Value = data; root.Save(xmlfile); } } public class User { public string Name { get; set; } public string Value { get; set; } } }

上のコードの実行結果は以下のようになります。(見やすいように改行を入れてます)

イメージ説明

投稿2021/04/28 03:06

SurferOnWww

総合スコア17424

BluOxy👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

okaken1

2021/04/28 03:14

ありがとうございました! これで進められそうです。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

XML

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

C#

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

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。