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

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

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

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

C#

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

.NET Framework 4.0

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

Q&A

解決済

1回答

2562閲覧

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

okaken1

総合スコア1

XML

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

C#

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

.NET Framework 4.0

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

0グッド

0クリップ

投稿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

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

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

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

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

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

退会済みユーザー

退会済みユーザー

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を使う方法でも問題ございません。
退会済みユーザー

退会済みユーザー

2021/04/27 10:15

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

2021/04/27 10:21

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

退会済みユーザー

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のネストについて調べてもイマイチ自分の課題に置き換えて解決方法が見い出せずにいます…。
退会済みユーザー

退会済みユーザー

2021/04/28 01:23

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

退会済みユーザー

2021/04/28 02:50

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

回答1

0

ベストアンサー

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

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

okaken1

2021/04/28 03:14

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問